我有以下代码
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
答案 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 );
格式正确,因为使用了直接初始化。