2013-08-18 28 views
4

这段代码不应该编译,所以为什么它是? if表达式中的上下文的原则是什么?为什么在“if表达式”中发生隐式转换,虽然它应该是明确的转换

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



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

感谢

+2

这是应该编译,这是一个被认为是“明确”的上下文。 – Mat

+1

您可以通过搜索“[C++]上下文转换的布尔”(不带引号)来查找相关文章。 – Mat

+2

什么是被视为“显式”的上下文,我可以在这里找到关于此的一些信息? – user2321876

回答

3

该代码非常应该编译。该标准花费了很大的努力,以确保它确实。

有很多地方的表达式被“上下文转换为bool”在这些地方,explicit bool转换将被调用,如果它们可用的话。其中一种上下文转换是if表达式,就像你的情况一样。

该语言允许explicit operator bool类型仍然用于条件检查if(expr),但是如果没有显式转换,则不能进行其他操作。你不能将它传递给一个需要bool的函数;你不能从返回bool的函数返回它,等等。

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

相关问题