это означает, что 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 не используется одр?

Ответы на вопрос(3)

Ваш ответ на вопрос