Рассмотрим этот пример из 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 не использовать odr? 6.2, пункт 3 [basic.def.odr] состояния
Переменная
x, имя которой отображается как потенциально оцененное выражениеex, является odr-используемымex, если
- ...
- Если
xявляется объектом,exявляется элементом набора потенциальных результатов выраженияe, где либо
- преобразование lvalue-to-rvalue (7.1) применяется к
eилиe- это выражение с отброшенным значением (раздел 8).
Проблема состоит в том, что выражение с отброшенным значением &S::x не имеет потенциальных результатов (это означает, что S::x не является потенциальным результатом &S::x), как вы можете видеть из пункта 6.2 главы 6.2 [basic.def.odr]:
... Множество потенциальных результатов выражения
eопределяется следующим образом:
- Если
eявляется id-выражением (8.1.4), набор содержит толькоe.- Если
e- операция подписи (8.2.1) с операндом массива, набор содержит потенциальные результаты этого операнда.- ...
- В противном случае набор пуст.
Затем, как вы можете объяснить, что S::x не используется odr?