我最近正在学习C++,我注意到了一个关于cp偏好的示例,它的一部分是这样的:
struct B
{
explicit B(int) { }
explicit operator bool() const { return true; }
};
int main()
{
B b2(2); // OK: direct-initialization selects B::B(int)
if (b2) ; // OK: B::operator bool()
}隐式转换的介绍告诉我,“当表达式在if语句或循环中使用时”,该表达式( b2 )的结果将隐式转换为bool类型。
此外,显式说明符的介绍告诉我,如果“转换函数是显式的,它不能用于隐式转换”。
既然b2将在if(b2)中隐式转换,而转换函数是explicit,那么if(b2)怎么会正常呢?
发布于 2019-01-29 15:35:14
语境转换是特殊的;由于C++11,在上下文转换中将考虑explicit转换函数。
(强调地雷)
(自C++11以来) 在以下上下文中,如果声明
bool t(e);格式良好(即显式转换函数,如显式T::operator bool() const;被认为是),则需要bool类型,并执行隐式转换。这样的表达式e被称为上下文转换为bool。
这意味着对于if (b2),b2将被B::operator bool()隐式转换为bool,即使它被声明为explicit。
发布于 2019-01-29 15:35:46
读在你自己的链接中。即使对于explicit转换,上下文转换也是隐式发生的:
语境转换 在以下上下文中,如果声明
bool;格式良好(即考虑explicit T::operator bool() const;之类的显式转换函数),则需要类型bool t(e);并执行隐式转换。这样的表达式e据说在上下文上被转换为bool。
if、while、for的表达;!、&&和||的操作数;?:的第一个操作数;static_assert声明中的谓词;noexcept说明符中的表达式;explicit说明符中的表达式;https://stackoverflow.com/questions/54424445
复制相似问题