某些语言结构要求将表达式转换为布尔值。在这种情况下出现的表达式
e
被称为上下文转换为bool
,当且仅当声明bool t(e);
对于一些虚构的临时变量t
是良好形式的(11.6)。
现在考虑以下代码片段。它无法编译,无论是在clang、GCC还是VS中。
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
因此,从[conv]/4我们得出结论,类型
A
没有被上下文地转换为bool
。来自[expr.unary.op]/9:
逻辑非运算符
!
的操作数会被上下文地转换为bool
(第7条);如果转换后的操作数为false,则其值为true,否则为false。结果的类型是bool
。我理解上面的段落是逻辑非运算符
!
的操作数必须被上下文地转换为bool
。我们刚才已经得出结论,类型A
没有被上下文地转换为bool
。因此,根据[expr.unary.op]/9,我们可以说以下代码不应该编译通过。但它在clang、GCC和VS中确实可以通过编译。struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t = !a;
}
我错过了什么?
A::operator!
。我认为这与operator,
相同,即使没有重载,逗号运算符也具有固有含义,但如果提供了重载,则已定义明确。 - Passer Bybool t(a);
更改为bool t(!a);
。这样编译器就能猜测需要应用operator!
了。 - Richard Critten