Я просто не могу понять 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 не применяется немедленно.
таким образом, он не проходит этот тест.
поскольку весь этот раздел находится под "Если", сбой означает, что применяется предыдущий случай; объект считается "используемым".