将对象转换为bool时,显式说明符似乎不起作用

Jin*_*hen 12 c++ explicit type-conversion

我最近在学习C++,我注意到了一个关于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()
}
Run Code Online (Sandbox Code Playgroud)

隐式转换的介绍告诉我"当表达式在if语句或循环中使用时",此表达式(b2)的结果将被bool隐式转换为类型.

此外,显式说明符的介绍告诉我"转换函数是否显式,它不能用于隐式转换".

由于b2将被隐式if(b2)转换,并且转换函数是explicit,怎么回事if(b2)

son*_*yao 12

上下文转换是特殊的; 从C++ 11开始,explicit转换函数将在上下文转换中考虑.

(强调我的)

(自C++ 11以来)

在下面的上下文中,类型bool是预期的,如果声明bool t(e);格式正确,则执行隐式转换(即,考虑显式转换函数,例如显式T :: operator bool()const;).据说这种表达e在上下文中被转换为bool.

  • 控制表达式if,while,for;
  • 内置逻辑运算符的操作数!,&&和||;
  • 条件运算符的第一个操作数?:;
  • static_assert声明中的谓词;
  • noexcept说明符中的表达式;
  • 表达式在显式说明符中; (自C++ 20起)
  • 合同属性的谓词.(自C++ 20起)

这意味着if (b2),即使它被声明为,b2也将被bool隐式转换B::operator bool()explicit.


Sha*_*ger 7

进一步阅读您自己的链接.即使对于explicit转化,也会隐式进行上下文转换:

上下文转换

在以下上下文中,类型bool是预期的,如果声明则执行隐式转换bool t(e); 格式良好(即,explicit T::operator bool() const;考虑显式转换函数).e据说这种表达在上下文中转换为bool.

  • 的控制表达if,while,for;
  • 内置逻辑运算符的操作数!,&&以及||;
  • 条件运算符的第一个操作数?:;
  • static_assert声明中的谓词;
  • 表达式中的表达式noexcept;
  • explicit说明符中的表达式;
  • 合同属性的谓词.