Рассмотрим этот пример из 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?