C++ 为什么常量指针会意外转换为布尔值?

C++ 为什么常量指针会意外转换为布尔值?,c++,casting,compiler-errors,boolean-expression,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; } }; 输出:B(bool) 理想的解决方案是 编译器错误:“没有有

我有一个有两个构造函数的类。一个用于
bool
,一个用于
A*

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


理想的解决方案是

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

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


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

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;
};

可能——但有没有一种解决方案可以让我不会意外地忘记所有可能的重载?@florgeng回答。这就是你想要的吗?是的,链接的答案适合我的问题——不幸的是——谢谢你。通过解释重载解析和隐式转换序列来扩展这个答案可能会有用。而且你还需要
显式B(std::nullptr\u t):B((A*)nullptr){}
;-)如果将
B(bool)
更改为
B(bool&)
,则问题也可以解决。或者考虑使用一个Type特性,如“谢谢”——现在我需要在我们的代码库中找到所有可能的“陷阱”,认为这不是一个复制品——建议的副本有一个<代码> STD::String 过载。这是非常不同的-字符串不是内置类型,并且不会转换为
bool
。指针有。@MSalters,它似乎是重复的,因为在链接的Qn中,OP希望
const char*
转换为
std::string
。这里是
常数A*
。您也可以将超级副本引用到链接的Qn。参考OP,它告诉我们链接的答案满足了这个查询。对我来说,使用链接的问题是可以的。似乎没有比链接的答案和@songyuanyao提到的更好的解决方案了。
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;
};
template <typename T>
B(T*) = delete;