это означает, что OP хочет получить ответ, подкрепленный ссылками на стандарт ISO C ++. Не имеет значения, что он компилируется (на самом деле многие нарушения ODR компилируются просто отлично).
отрим этот пример изcppreference:
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
Я согласен, что&S::x
этовыражение отброшенного значенияпоскольку стандарт гласит (9.2, пункт 1 [stmt.expr] изn4700)
Выражения выражения имеют вид
expression-statement:
expression_opt ;
Выражение является выражением отброшенного значения (раздел 8) ...
Однако этого достаточно дляS::x
не бытьУСО используемый? 6.2, пункт 3 [basic.def.odr] гласит
Переменнаяx
чье имя появляется как потенциально оцененное выражениеex
являетсяУСО используемый поex
если
x
это объект,ex
является элементом множества потенциальных результатов выраженияe
где либопреобразование lvalue в rvalue (7.1) применяется кe
, или жеe
является выражением отброшенного значения (раздел 8).Проблема в том, что выражение отброшенного значения&S::x
не имеет потенциальных результатов (что означает, чтоS::x
не является потенциальным результатом&S::x
), как вы можете видеть из 6.2, параграф 2 [basic.def.odr]:
... Множество потенциальных результатов выраженияe
определяется следующим образом:
e
является id-выражением (8.1.4), набор содержит толькоe
.Еслиe
является подписывающей операцией (8.2.1) с операндом массива, набор содержит потенциальные результаты этого операнда....В противном случае набор пуст.Тогда, как вы можете объяснить, чтоS::x
не используется одр?