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关键字,但是没有用。
我们无法阻止从指针到;的隐式转换(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)