为什么 const 指针会意外转换为 bool?

flo*_*eng 3 c++ casting compiler-errors boolean-expression

我有一个带有两个构造函数的类。一为bool一为A*

struct B
{
    explicit B(bool b)
    {
      std::cout << "B(bool)" << std::endl;
    }
    explicit B(A*)
    {
      std::cout << "B(A*)" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

当 B 应该用const A*而不是A*-构造时,const A*将转换为bool.

const A a;
B b(&a);
Run Code Online (Sandbox Code Playgroud)

输出: B(bool)


所需的解决方案是

编译器错误:“B(const A*) 没有有效的构造函数”

我已经尝试过使用explicit关键字,但是没有用。

在coliru运行示例

son*_*yao 5

我们无法阻止从指针到;的隐式转换(bool 转换bool。您可以添加另一个重载构造函数 take const A*,它将在传递时在重载解析中选择const A*,因为它是完全匹配的并且B::B(bool)需要隐式转换。将其标记为delete,如果它被选中,程序就会变得格式错误。

struct B
{
    explicit B(bool b)
    {
      std::cout << "B(bool)" << std::endl;
    }
    explicit B(A*)
    {
      std::cout << "B(A*)" << std::endl;
    }
    B(const A*) = delete;
};
Run Code Online (Sandbox Code Playgroud)

居住

或者您可以将重载的构造函数标记为采用指针类型delete,然后所有指针类型都不能传递给B::B,除了A*像您所做的那样单独声明构造函数。

template <typename T>
B(T*) = delete;
Run Code Online (Sandbox Code Playgroud)

居住