¿Por qué S :: x no se usa odr?
Considere este ejemplo decppreference:
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
Estoy de acuerdo que&S::x
es unexpresión de valor descartado, ya que el estándar dice (9.2, párrafo 1 [stmt.expr] den4700)
Las declaraciones de expresión tienen la forma
expression-statement:
expression_opt ;
La expresión es una expresión de valor descartado (Cláusula 8) ...
Sin embargo, ¿es eso suficiente paraS::x
no serodr-used? 6.2, el párrafo 3 [basic.def.odr] establece
Una variablex
cuyo nombre aparece como una expresión potencialmente evaluadaex
esodr-used porex
a no ser que
x
es un objetoex
es un elemento del conjunto de resultados potenciales de una expresióne
, donde cualquierala conversión lvalue-to-rvalue (7.1) se aplica ae
oe
es una expresión de valor descartado (Cláusula 8).El problema es que la expresión de valor descartado&S::x
no tiene resultados potenciales (lo que significa queS::x
no es un resultado potencial de&S::x
), como puede ver en 6.2, párrafo 2 [basic.def.odr]:
... El conjunto de resultados potenciales de una expresióne
se define de la siguiente manera:
e
es una expresión de identificación (8.1.4), el conjunto contiene soloe
.Sie
es una operación de subíndice (8.2.1) con un operando de matriz, el conjunto contiene los resultados potenciales de ese operando....De lo contrario, el conjunto está vacío.Entonces, ¿cómo puedes explicar eso?S::x
no se usa odr?