为什么 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
关键字,但没有成功。
我们无法停止隐式转换(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;
};
或者你可以标记重载的构造函数采用指针类型delete
,那么所有的指针类型都不能传递给B::B
,除了声明构造函数的A*
像你一样分开。
template <typename T>
B(T*) = delete;
我有一个带有两个构造函数的 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
关键字,但没有成功。
我们无法停止隐式转换(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;
};
或者你可以标记重载的构造函数采用指针类型delete
,那么所有的指针类型都不能传递给B::B
,除了声明构造函数的A*
像你一样分开。
template <typename T>
B(T*) = delete;