Кто-нибудь может объяснить этот параграф текущего проекта стандарта C ++ 0x? - PullRequest
13 голосов
/ 06 апреля 2011

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

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

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

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

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

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

1 Ответ

11 голосов
/ 06 апреля 2011

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

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

Так что это на самом деле не изменения, просто обновленные формулировки для C ++ 0x.

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

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

против

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

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

char x[a];

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

void foo(int); foo(a);

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...