Prenons cet exemple de cppreference:
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
Je suis d'accord qu' &S::x
est un rebut de la valeur de l'expression, étant donné que la norme dit (9.2, paragraphe 1 [stmt.expr] de n4700)
L'Expression des énoncés de la forme
expression-statement: expression_opt ;
L'expression est un jeté de la valeur de l'expression (article 8)...
Cependant, est-ce suffisant pour l' S::x
à ne pas être odr-utilisé? 6.2, paragraphe 3 [de base.def.odr] les états
Une variable
x
dont le nom apparaît comme potentiellement-de l'expression évaluéeex
est odr-utilisée parex
, à moins que
- ...
- si
x
est un objet,ex
est un élément de l'ensemble des résultats possibles d'une expressione
, où
- la lvalue-à-rvalue de conversion (7.1) est appliquée à l'
e
, oue
est un jeté de la valeur de l'expression (article 8).
Le problème est que le rebut de la valeur de l'expression &S::x
n'a pas de potentiel de résultats (ce qui signifie qu' S::x
n'est pas un résultat possible de l' &S::x
), comme vous pouvez le voir à partir de 6.2, paragraphe 2 [de base.def.odr]:
... L'ensemble des résultats possibles d'une expression
e
est définie comme suit:
- Si
e
est un id-expression (8.1.4), l'ensemble ne contient qu'e
.- Si
e
est un subscripting opération (8.2.1) avec un tableau opérande, l'ensemble contient les résultats potentiels de l'opérande.- ...
- Sinon, l'ensemble est vide.
Alors, comment pouvez-vous expliquer qu' S::x
n'est pas odr-utilisé?