2013-08-14 2 views
10

Является ли следующая единица перевода C++ 11 хорошо сформированной?Декларация C++ 11 `:: T i`?

typedef int T; 
::T i; 

Если это так, похоже, не соответствует стандартной грамматике.

simple-type-specifier должен соответствовать ::T, но грамматика:

simple-type-specifier: 
    nested-name-specifier_opt type-name 

и nested-name-specifier может не совпадать :: в одиночку, так simple-type-specifier может не совпадать ::T.

Является ли это стандартным дефектом?

+2

Извините, если это неверно, но не ':: identifier' ссылается на (квалифицированный)' идентификатор' в глобальном пространстве имен? –

+1

«' inest-name-specifier' не может совпадать с '::' "- так как вы уверены в этом, вы должны включить объяснение, почему оно не может совпадать в вашем вопросе. –

+0

@ H2CO3 Вы правы, сэр! – nijansen

ответ

13

Это дефект спецификации. Она фиксируется в последнем проекте, N3691 (PDF), где вложенное имя спецификатор является:

nested-name-specifier: 
    :: 
    type-name :: 
    namespace-name :: 
    decltype-specifier :: 
    nested-name-specifier identifier :: 
    nested-name-specifier templateopt simple-template-id :: 

(В C++ 11, первое производство, вложенного имя-спецификатор ->::, отсутствует)

+0

Привет, Джеймс, мы работаем с N3485, так что это объясняет это. Благодарю. –

+0

Следует также отметить, что исправление «id-id» также было выполнено исправлением, так как оно больше не нуждается в особых случаях для одиночных префиксов '::', поэтому эти случаи были удалены. –

1

Таким образом, в дополнение к ответ, просто как разъяснение:. ::identifier относится к (квалифицированным) идентификатор в глобальном пространстве имен. Итак, да, этот код действительно хорошо сформирован.