Может ли кто-нибудь объяснить этот параграф существующего стандартного черновика С++ 0x?

Может ли кто-нибудь объяснить это утверждение из ISO N3242 §3.2, 2nd point

Выражение потенциально оценивается, если оно не является неоцененным операндом       (Пункт 5) или его подвыражение. Переменная или неперегруженная функция, имя которой отображается как потенциально оцененное выражение odr-used, если это не объект, который удовлетворяет требованиям, предъявляемым в постоянная       выражение (5.19) и преобразование lvalue-to-rval (4.1) немедленно       применяется. это используется odr, если оно выглядит как потенциально выражение       (в том числе в результате неявного преобразования в теле       нестатическая функция-член (9.3.1)).

Стандарт ИСО 2003: говорит

Выражение потенциально оценивается, если оно не появляется там, где интеграл        требуется постоянное выражение (см. 5.19), является операндом размер        оператор (5.3.3), или является операндом оператора typeid и выражение        не обозначает lvalue типа полиморфного класса (5.2.8). объект или        функция, не перегруженная, используется, если ее имя отображается в потенциально оценены        выражение.

Какова фактическая разница в этих утверждениях?

Может ли кто-нибудь объяснить это с помощью примера/программы?

Ответ 1

"unevaluated operand" заменяет "является операндом оператора sizeof (5.3.3) или является операндом оператора typeid, а выражение не обозначает lvalue типа полиморфного класса (5.2.8)". Он имеет ту же основную цель, но не пытается перечислить все случаи в стандарте С++ 0x операторов, операнды которых не оцениваются. decltype является новым, например.

"odr-used" заменяет "used", я полагаю, они полагали, что только одно "использование" может быть неоднозначным с другими словами использования "use" в стандарте. В обоих случаях, однако, он определяет смысл "использования", который имеет отношение к ODR.

Таким образом, это не изменения, а только обновленные версии для С++ 0x.

Это изменение:

Переменная или неперегруженная функция чье имя отображается как потенциально оцениваемое выражение odr-used, если это не объект который удовлетворяет требованиям для появляясь в постоянном выражении (5.19) и lvalue-to-rvalue преобразование (4.1) немедленно приложенное.

против.

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

Предположим, что a является static const int в глобальном масштабе. Затем в С++ 03 он не используется в следующем выражении:

char x[a];

потому что для контекста требуется постоянное выражение. Однако он используется в следующем:

void foo(int); foo(a);

потому что контекст не требует постоянного выражения.

В С++ 0x a не используется в любом случае. Он позволяет находиться в постоянном выражении, а в вызове функции немедленно применяется преобразование lvalue-rvalue (потому что foo принимает свой параметр по значению, а не по ссылке). Таким образом, он подходит для "если", который не присутствовал в С++ 03.

Также существует разница в определении "потенциально оцениваемая". В первом примере char x[a], a потенциально оценивается в С++ 03, но не в С++ 0x. Я не проверял, использует ли что-либо другое в стандарте "потенциально оцениваемое", на которое может повлиять это изменение. Если это упоминается только здесь, то эта часть не является изменением, просто исключение переместилось из "потенциально оцениваемого" в "использовано".