[conv]/4:[expr.unary.op]/9 semble impliquer que l'opérateur `(!)` N'a pas pu être appliqué au type A ci-dessous. Mais compilateurs en désaccord avec cette
Certaines constructions linguistiques exigent que l'expression soit converti en une valeur booléenne. Une expression
e
apparaissant dans un tel contexte est dit être converti en contextuellementbool
et est bien formée si et que si la déclarationbool t(e);
est bien formée, pour une variable temporaire inventéest
(11,6).
Considérons maintenant l'extrait ci-dessous. Il ne compile pas, ni dans clang, GCC ou VS.
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
Ainsi, à partir de [conv]/4 nous concluons que le type A
est pas contextuellement converti en bool
.
L'opérande de l'opérateur de négation logique
!
est contextuellement converti enbool
(Article 7); sa valeur esttrue
si l'opérande converti estfalse
etfalse
sinon. Le type du résultat estbool
.
Ma compréhension du paragraphe ci-dessus est que l'opérande de l'opérateur de négation logique !
doit être converti en contextuellement bool
. Nous venons de conclure que le type A
est et non converti contextuellement en bool
. Par conséquent, à partir de [expr.unary.op]/9, nous pouvons dire que le code suivant doit pas compiler. Mais il le fait, en clang, GCC et VS.
Que manque-t-il?
Ce n'est pas un opérateur de négation logique, c'est la fonction membre 'A :: operator!', C'est ma supposition de toute façon. Je crois que c'est la même chose avec 'operator,', l'opérateur de virgule a une signification inhérente même sans surcharge, mais est bien défini quand il est surchargé –
Essayez de changer 'bool t (a);' à bool t (! a); 'dans votre 1er exemple. Comme dans comment le compilateur peut-il deviner qu'il doit appliquer 'operator!'. –
[Clause \ [expr \] définit les effets des opérateurs appliqués aux types pour lesquels ils n'ont pas été surchargés.] (Http://eel.is/c++draft/expr#3.sentence-1) – cpplearner