4

这段代码不应该编译,为什么会这样?if 表达式中上下文的原理是什么?

class B {  
public:  
    B() {}  
    explicit operator bool () {}  
};  



int main (){  
    B Bp;  
  //bool check = Bp // error
    if (Bp){   //o.k
        return 1;  
    }  
    return 0;  
}  

谢谢

4

1 回答 1

3

该代码非常应该编译。该标准花费了大量的精力来确保它确实如此。

在许多地方,表达式“在上下文中转换为 bool” 在这些地方,explicit如果布尔转换可用,则将调用它们。if与您的情况一样,这些上下文转换之一是表达式。

这种语言允许explicit operator bool类型仍然用于条件检查if(expr),但是如果没有显式转换,你就不能做其他事情。您不能将其传递给采用bool;的函数。您不能从返回的函数中返回它bool,依此类推。

所有的上下文转换都是语言特征中的显式表达。因此explicit operator bool可以保护您免受隐式用户定义的转换,同时仍然允许发生语言定义的转换。

于 2013-08-18T21:14:29.013 回答