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

时间:2019-01-29 15:31:39

标签: c++ type-conversion explicit

我最近正在学习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)可以吗?

2 个答案:

答案 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

     
      
  • ifwhilefor的控制表达式;
  •   
  • 内置逻辑运算符!&&||的操作数;
  •   
  • 条件运算符?:的第一个操作数;
  •   
  • static_assert声明中的谓词;
  •   
  • noexcept修饰符中的表达式;
  •   
  • explicit修饰符中的表达式;
  •   
  • 合同属性的谓词。
  •