Por que S :: x não é usado por odr?
Considere este exemplo decppreference:
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
Eu concordo que&S::x
é umexpressão de valor descartado, uma vez que a norma diz (9.2, parágrafo 1 [stmt.expr] den4700)
Instruções de expressão têm o formato
expression-statement:
expression_opt ;
A expressão é uma expressão de valor descartado (Cláusula 8) ...
No entanto, isso é suficiente paraS::x
não serodr-used? 6.2, o parágrafo 3 [basic.def.odr] declara
Uma variávelx
cujo nome aparece como uma expressão potencialmente avaliadaex
éodr-used porex
a menos que
x
é um objetoex
é um elemento do conjunto de resultados potenciais de uma expressãoe
, ondea conversão lvalue em rvalue (7.1) é aplicada ae
oue
é uma expressão de valor descartado (Cláusula 8).O problema é que a expressão de valor descartado&S::x
não tem resultados em potencial (o que significa queS::x
não é um resultado potencial de&S::x
), como você pode ver na seção 6.2, parágrafo 2 [basic.def.odr]:
... O conjunto de resultados potenciais de uma expressãoe
é definido da seguinte maneira:
e
é uma expressão id (8.1.4), o conjunto contém apenase
.E see
é uma operação de subscrição (8.2.1) com um operando de matriz, o conjunto contém os resultados potenciais desse operando....Caso contrário, o aparelho está vazio.Então, como você pode explicar issoS::x
o odr não é usado?