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

Oys*_*ein 14 c++ types boolean implicit

考虑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;}
};
Run Code Online (Sandbox Code Playgroud)

使用字符串文字实例化类,并猜测调用哪个构造函数?

foo a ("/path/to/file");
Run Code Online (Sandbox Code Playgroud)

输出:

ctor 2

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

Lou*_*nco 10

写这篇文章在C中很常见

void f(T* ptr) {
    if (ptr) {
        // ptr is not NULL
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当然你的意思是`if(!ptr)return;`?:)我们不希望我们的整个函数嵌套块超过必要的. (8认同)
  • @GMan:令人愤怒的是,我实际上不得不*捍卫*那种返回声明,因为决定多个返回声明本身就令人困惑且难以遵循的权力,并且在编码标准中体现了这种信念. (4认同)

Nat*_*man 5

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