考虑具有两个这样定义的构造函数的类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");
输出:
ctor 2
我不了解你,但我没有发现编程历史中最直观的行为。我打赌它有一些聪明的理由,但我想知道它可能是什么?
答案 0 :(得分:10)
在C中写这个很常见
void f(T* ptr) {
if (ptr) {
// ptr is not NULL
}
}
你应该建一个const char*
构造函数。
答案 1 :(得分:3)
您将char *传递给foo构造函数。这可以隐式转换为布尔值(如同所有指针一样)或std :: string。从编译器的角度来看,第一次转换比第二次转换“更接近”,因为它更倾向于标准转换(即指向bool的指针)而不是用户提供的转换(std :: string(char *)构造函数)。
答案 2 :(得分:0)
你混淆了两个问题。一个是"blah"
可以隐式转换为string
,另一个是const char*
可以隐式转换为布尔值。看到编译器转到隐式转换是非常合乎逻辑的,这可以最大限度地减少所需的转换总量。