为什么隐式转换发生在“if expression”中,尽管它应该是显式转换

时间:2013-08-18 20:55:24

标签: c++11 type-conversion explicit

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

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



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

由于

1 个答案:

答案 0 :(得分:3)

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

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

此语言允许explicit operator bool类型仍然用于条件检查if(expr),但如果没有显式转换,则无法使用其他内容。你不能将它传递给一个bool的函数;你不能从返回bool的函数返回它,等等。

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