显式转换运算符bool

时间:2017-03-05 20:55:02

标签: c++

我有以下代码

  class C
    {
    public:
        C(bool v_):v(v_){};
        explicit operator bool() const {return v;}
        bool v = false;    
    };

 int main(){
  C a{true};
  C b{false};
  // C d = true; // doesn't compile, since requires explicit conversion
  C d = static_cast<bool>(true); // fine

  if(a || b) std::cout << "conversion happened!" << std::endl; // why it doesn't require explicit conversion here?

 }

输出“转换发生!”。我的问题是为什么||被认为是一种明确的转换?

修改

  // C d = true; // actually this line compiles because of the constructor

2 个答案:

答案 0 :(得分:7)

来自[expr.log.or]:

  

操作数在上下文中都转换为bool

允许使用显式转换进行上下文转换为bool。这就是“上下文”这一概念的要点:显式转换是在有意义的时候准确允许的,而不是其他方式,因此你不会意外地从bool转换中形成任意的整数或指针值,但是当你真正要求布尔,你明白了。

详见[conv] / 4:

  

某些语言结构要求将表达式转换为布尔值。表达式e   出现在这样的上下文中据说是在上下文中转换为bool 并且当且仅当   对于一些发明的临时变量bool t(e);

,声明t格式正确

答案 1 :(得分:1)

来自C ++标准(4次标准转换)

  

4某些语言结构要求转换表达式   到布尔值。在这样的背景下出现的表达是   据说是在上下文中转换为bool ,并且如果是,则表现良好   并且只有声明bool t(e);对某些人而言,这是一个良好的形式   发明了临时变量t(8.5)。

和(5.15逻辑OR运算符)

  

1 ||操作员组从左到右。操作数都是   从根本上转换为bool (第4条)。如果其任一操作数为true,则返回true,否则返回false。与|,||不同   保证从左到右的评估;而且,第二个操作数是   如果第一个操作数的计算结果为true,则不进行评估。

最后(12.3.2转换函数)

  

2转换函数可以是显式的(7.1.2),在这种情况下它是   仅被视为用户定义的转换   直接初始化(8.5)。否则,用户定义的转换不限于在分配和初始化中使用。

相对于您的示例,变量t

的发明声明
C c( true );

bool t( c ); 

格式正确,因为使用了直接初始化。