Я просто не могу понять DR 712

д-р 712 несет ответственность за изменение формулировки [basic.защита.odr] / 2 в C++11 в текущей редакции сегодня, в [basic.защита.odr]2 и 3. Но я все еще пытаюсь понять причину изменения, как указано в DR, следующим образом:

712. Используются ли целочисленные постоянные операнды условного выражения"?"

при описании статических членов данных, инициализированных внутри класса определение, 9.2.3.2 [класс.статический.data] в пункте 3 говорится:

член должен быть определен в области пространства имен, если он используется в программе...

определение "используется" содержится в 3.2 [basic.защита.odr] пункт 1:

объект или ненагруженная функция, имя отображается как потенциально оцененное
    выражение используется, если это не объект, удовлетворяющий требованиям для отображения в     константное выражение (5.20 [выражение.const]) и преобразование lvalue в rvalue (4.1 [conv.lval])
    применяется немедленно.

Теперь рассмотрим следующий пример:

 struct S {
      static const int a = 1;
      static const int b = 2;
 };
 int f(bool x) {
      return x ? S::a : S::b;
 }

в соответствии с нынешней формулировкой стандарта, этот пример требует, чтобы S::a и S::b определяется в области пространства имен. Этот причина этого заключается в том, что, согласно 5.16 [expr.cond] пункт 4, результатом этого условного выражения является lvalue и lvalue-to-rvalue преобразование применяется к этому, а не непосредственно к объект, так это не "немедленно применил" требование. Это удивительно и прискорбно, так как только ценности, а не используются адреса статических элементов данных. (Эта проблема также относится к предлагаемому решению вопроса 696.)

Ну, если " немедленно примененное требование терпит неудачу, то выражения S::a и S::b в условном выражении не используется (odr-используется), и поэтому соответствующие статические члены struct S будет не необходимо определить в области пространства имен. Но это прямо противоположно тому, что говорит доктор. Что я упускаю???

2 ответов


Я думаю, что вы упускаете суть used определение:

it is used UNLESS ( (const) AND (immediately applied) )

Итак, если "немедленно применено" ложно, то "если" ложно, и, таким образом, оно используется.


объект или ненагруженная функция, имя которой отображается как потенциально оцениваемое выражение, используется, если только[...]

Ну S::a и S::b отображаются в потенциально оцениваемом выражении в f.

таким образом, они используются, если не применяется одно из следующих исключений.

[...] это объект, который удовлетворяет требованиям для появления в постоянном выражении (5.20 [expr.const]) и преобразование lvalue в rvalue (4.1 [conv.lval]) применяется немедленно.

Ну, это объект, который удовлетворял требованию для появления в постоянном выражении. Итак, он проходит этот тест.

но преобразование lvalue в rvalue не применяется немедленно.

таким образом, он не проходит этот тест.

поскольку весь этот раздел находится под "Если", сбой означает, что применяется предыдущий случай; объект считается "используемым".