我最近正在学习C ++,并且注意到example on cppreference,其中一部分是这样的:
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()
}
implicit conversions的介绍告诉我“在if语句或循环中使用表达式时”,该表达式(b2)的结果将隐式转换为bool
类型。
另外,explicit specifier的介绍告诉我“转换函数是否显式,不能用于隐式转换”。
由于b2将在if(b2)
中隐式转换,并且转换函数为explicit
,因此if(b2)
可以吗?
答案 0 :(得分:12)
Contextual conversion很特殊;从C ++ 11开始,explicit
转换函数将在上下文转换中考虑。
(重点是我的)
(自C ++ 11起)
在以下上下文中,类型
bool
,预计和如果声明bool t(e);
是公形成执行隐式转换(即,显式转换功能,诸如显性Ť ::运算布尔()const的;被认为是)即可。据说这种表达式e是 上下文转换为bool 。
- if,while,for的控制表达式;
- 内置逻辑运算符!,&&和||;
的操作数- 条件运算符的第一个操作数:;
- 在一个static_assert声明的谓语;
- noexcept说明符中的表达式;
- 显式说明符中的表达式; (自C ++ 20起)
- 合同属性的谓词。 (自C ++ 20起)
这意味着对于if (b2)
,b2
会被bool
隐式转换为B::operator bool()
,即使它被声明为explicit
。
答案 1 :(得分:7)
阅读further in your own link。即使对于explicit
转换,上下文转换也会隐式发生:
上下文转化
在以下情况下,如果声明为
bool
,则类型为bool t(e)
,并且将执行隐式转换。格式正确(即考虑使用显式转换函数,例如explicit T::operator bool() const;
)。据说这样的表达式e
被上下文转换为bool
。
if
,while
,for
的控制表达式;- 内置逻辑运算符
!
,&&
和||
的操作数;- 条件运算符
?:
的第一个操作数;static_assert
声明中的谓词;noexcept
修饰符中的表达式;explicit
修饰符中的表达式;- 合同属性的谓词。