代码之家  ›  专栏  ›  技术社区  ›  Beau Simensen

为什么引用的字符串与std::string之前的bool方法签名匹配?

  •  14
  • Beau Simensen  · 技术社区  · 16 年前

    给出以下方法:

    // Method 1
    void add(const std::string& header, bool replace);
    
    //Method 2
    void add(const std::string& name, const std::string& value);
    

    下面的代码将最终调用方法1而不是方法2:

    something.add("Hello", "World");
    

    我最终创建了另一个方法,看起来像这样:

    //Method 3
    void MyClass::add(const char* name, const char* value) {
        add(std::string(name), std::string(value));
    }
    

    它奏效了。因此,当一个方法接受一个“带引号的字符串”时,它将按以下顺序匹配:

    1. const char*
    2. bool
    3. std::string

    为什么将带引号的字符串视为 布尔 之前 STD::字符串 ?这是常见的行为吗?我已经为这个项目编写了相当多的代码,并且没有任何其他问题,因为选择了错误的方法签名…

    3 回复  |  直到 16 年前
        1
  •  14
  •   Sam Harwell    16 年前

    我的猜测是从指针到bool的转换是一种隐式的基元类型转换,其中 std::string 需要构造函数的调用和临时的构造。

        2
  •  9
  •   Kirill V. Lyadvinsky    16 年前

    在您的例子中,您已经重载了函数。过载分辨率根据第13.3节进行。

    C++ 03 133.3.2/2:

    比较隐式转换序列的基本形式时(如13.3.3.1中所定义)
    标准转换序列(13.3.3.1.1)比用户定义的转换序列或省略号转换序列更好,以及
    用户定义的转换序列(13.3.3.1.2)比省略号转换序列(13.3.3.1.3)更好。

    将指针转换为bool是标准转换。将指针转换为std::string是用户定义的转换。

    4.12布尔转换 算术、枚举和 指针 或指向成员类型的指针无法转换为类型的右值 布尔 . 零值、空指针值或空成员指针值转换为false;任何其他值转换为true。

        3
  •  6
  •   rlbond    16 年前

    指针隐式转换为 bool . 也许您看到了以下内容:

    void myFunc(int* a)
    {
        if (a)
            ++(*a);
    }
    

    现在,在C++中,内置类型之间的隐式转换优先于类类型之间的转换。例如,如果您有一个类:

    class Int
    {
    public:
        Int(int i) {}
    }
    

    并且你重载了一个函数 long Int :

    void test(long n) {cout << "long";}
    void test(Int n) {cout << "Int";}
    

    您将看到以下代码调用长重载:

    int i;
    test(i);