为什么在“if表达式”中会发生隐式转换,尽管应该是显式转换?

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;  
}  

谢谢


2
它应该编译通过,这是一个被认为是“显式”的上下文。 - Mat
1
通过搜索 "[c++] contextually converted bool"(不带引号),您将找到相关的帖子。 - Mat
2
哪些上下文被认为是“显式”的?我能在哪里找到这方面的信息? - user2321876
1个回答

3
那段代码应该是可以编译的。标准花费了很多努力来确保它可以编译。
有一些情况下,一个表达式会被"上下文转换为bool",在这些情况下,如果"explicit" bool转换可用,它就会被调用。其中之一是像你的情况一样的"if"表达式。
这种语言允许使用"explicit operator bool"类型进行条件检查"if(expr)", 但你不能进行其他操作而没有显式的转换。你不能将它传递给一个接受"bool"的函数;你不能从返回"bool"的函数中返回等等。
所有上下文转换都是语言特性中的显式表达式。因此,"explicit operator bool"可以保护你免受隐式用户定义转换的影响,同时仍允许发生语言定义的转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接