gpt4 book ai didi

c++ - [expr.unary.op]/9 似乎暗示 `operator !()` 不能应用于下面的类型 A。但编译器不同意这一点

转载 作者:可可西里 更新时间:2023-11-01 18:30:51 27 4
gpt4 key购买 nike

[conv]/4 :

Certain language constructs require that an expression be converted to a Boolean value. An expression e appearing in such a context is said to be contextually converted to bool and is well-formed if and only if the declaration bool t(e); is well-formed, for some invented temporary variable t (11.6).

现在考虑下面的片段。它不编译,也不在 clang 中, GCCVS .

struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}

因此,从 [conv]/4 我们得出结论,A 类型根据上下文转换为 bool

[expr.unary.op]/9 :

The operand of the logical negation operator ! is contextually converted to bool (Clause 7); its value is true if the converted operand is false and false otherwise. The type of the result is bool.

我对上面段落的理解是,逻辑否定运算符 ! 的操作数必须根据上下文转换为 bool。我们刚刚得出结论,A 类型根据上下文转换为bool。因此,从 [expr.unary.op]/9,我们可以说下面的代码应该编译。但确实如此,在 clang 中, GCCVS .

struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t = !a;
}

我错过了什么?

最佳答案

[expr]整体适用于内置运算符:

Clause [expr] defines the effects of operators when applied to types for which they have not been overloaded.

[expr.unary.op] 中的定义只是内置运算符的定义!。此外,[over.match.oper]描述了如何查找重载运算符:

For a unary operator @ with an operand of a type whose cv-unqualified version is T1, [...], three sets of candidate functions, designated member candidates, non-member candidates and built-in candidates, are constructed as follows: [...]

对于 !a,您有两个候选者:您的重载 A::operator!()[over.built] 中定义的内置函数:

There also exist candidate operator functions of the form

bool operator!(bool);

对于通过重载决议选择的内置函数,类型必须根据上下文转换为 bool 正如您的论点所建议的那样。然而,这个候选者是不可行的——但是重载的成员运算符是可行的。


T.C.像往常一样在它上面,指出cwg issue 1919这表明 可以根据上下文转换为 bool 的类型仍然不应该使用内置的 operator! 因为措辞问题。尽管 gcc 和 clang 都允许它(这可能是我们所有人都希望发生的事情)。

关于c++ - [expr.unary.op]/9 似乎暗示 `operator !()` 不能应用于下面的类型 A。但编译器不同意这一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44679200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com