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

时间:2019-12-17 11:04:59

标签: 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;
    }
};

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

const A a;
B b(&a);

输出: B(bool)


所需的解决方案是

  

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

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

running example at coliru

1 个答案:

答案 0 :(得分:5)

我们无法停止从指向bool的指针的隐式转换(bool conversion);您可以添加另一个带有const A*的重载构造函数,在传递const A*时将在overload resolution中选择该构造函数,因为它是完全匹配的,并且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;
};

LIVE

或者您可以标记重载的构造函数为指针类型delete,然后所有的指针类型都不能传递给B::B,除了A*以外,构造函数的声明类似于你已经完成了。

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

LIVE