Объявление С++ 11 `:: T i`?

Является ли правильно сформированная единица перевода С++ 11?

typedef int T;
::T i;

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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