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

Why is a const pointer accidentally converted to bool?

我有一个带有两个构造函数的 class。一份用于 bool 一份用于 A*.

struct B
{
    explicit B(bool b)
    {
      std::cout << "B(bool)" << std::endl;
    }
    explicit B(A*)
    {
      std::cout << "B(A*)" << std::endl;
    }
};

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

const A a;
B b(&a);

输出:B(bool)


所需的解决方案是

compiler error : "no valid constructor for B(const A*)"

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

running example at coliru

我们无法停止隐式转换(bool conversion) from pointer to bool; You can add another overloaded constructor taking const A*, which will be selected in overload resolution when passing const A*, because it's an exact match and B::B(bool) requires an implicit conversion. With marking it as 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;
};

LIVE

或者你可以标记重载的构造函数采用指针类型delete,那么所有的指针类型都不能传递给B::B,除了声明构造函数的A*像你一样分开。

template <typename T>
B(T*) = delete;

LIVE