为什么在C ++中有从指针到bool的隐式类型转换?

时间:2010-11-06 01:57:57

标签: c++ types implicit boolean

考虑具有两个这样定义的构造函数的类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

我不了解你,但我没有发现编程历史中最直观的行为。我打赌它有一些聪明的理由,但我想知道它可能是什么?

3 个答案:

答案 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*可以隐式转换为布尔值。看到编译器转到隐式转换是非常合乎逻辑的,这可以最大限度地减少所需的转换总量。