21

考虑foo具有这样定义的两个构造函数的类:

class foo
{
public:
    foo(const std::string& filename) {std::cout << "ctor 1" << std::endl;}
    foo(const bool some_flag = false) {std::cout << "ctor 2" << std::endl;}
};

用字符串字面量实例化类,猜猜调用了哪个构造函数?

foo a ("/path/to/file");

输出:

演员 2

我不了解你,但我认为这不是编程历史上最直观的行为。不过,我敢打赌,这有一些聪明的理由,我想知道那可能是什么?

4

3 回答 3

15

在 C 中写这个很常见

void f(T* ptr) {
    if (ptr) {
        // ptr is not NULL
    }
}

你应该做一个const char*构造函数。

于 2010-11-06T02:09:07.010 回答
5

您将 char* 传递给 foo 构造函数。这可以隐式转换为布尔值(所有指针都可以)或 std::string。从编译器的角度来看,第一次转换比第二次“更接近”,因为它支持标准转换(即指向 bool)而不是用户提供的转换(std::string(char*) 构造函数)。

于 2010-11-06T02:13:42.773 回答
-1

你混淆了两个问题。一种是"blah"可以隐式转换为a string,另一种是const char*可以隐式转换为布尔值。看到编译器进行隐式转换是非常合乎逻辑的,这可以最大限度地减少必要的转换总量。

于 2010-11-06T02:12:57.287 回答