Объявление С++ 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
относится к (квалифицированному) идентификатору в глобальном пространстве имен. Итак, да, этот код действительно хорошо сформирован.