Глобальная квалификация в базовом спецификаторе - PullRequest
1 голос
/ 15 августа 2011

В качестве продолжения " Что это за сумасшедший синтаксис C ++ 11 ==> struct: bar {} foo {};? ", я ожидаю, что следующий C ++ 0xкод для компиляции:

struct x {};
struct :::x {} y {};

Однако GCC 4.7.0 20110731 сообщает мне:

ошибка: глобальная квалификация имени класса недопустима перед ':' token

И когда я делаю шаг назад к здравомыслию и даю имя второму UDT:

struct x {};
struct a:::x {} y{}; // remember, identical to `a::: x` or `a: ::x` or `a:: :x` etc

, ошибка:

ошибка: 'a' имеетне было объявлено


Кажется, что три двоеточия лексизированы как <::> <:>, а не <:> <::>, но это может быть ясно выведено из [окончательного варианта] стандарт?

И может ли быть связан вопрос " Глобальная квалификация в объявлениях класса class-head "?

Ответы [ 2 ]

6 голосов
/ 15 августа 2011

Это просто связано с разбором. Из §2.5.3

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

По сути, он должен принимать самую длинную последовательность символов, поэтому ::: всегда анализируется как :: : так же, как x+++y всегда анализируется как x ++ + y.

Это называется Максимальный Munch парсинг.

6 голосов
/ 15 августа 2011

Кажется, что эти три двоеточия лексизируются как чем <:> <::>, но может ли это быть ясно выведено из [окончательного варианта] стандарт

Это уже не [окончательный] черновик. Это было единогласно принято уже. И да, можно сделать вывод, что ::: будет проанализирован как :: с последующим :. Это чисто лексическая проблема. Как и в C ++ 03, токен считается самым длинным из возможных. В C ++ 03 это привело к закрытию шаблона >> s как к оператору сдвига. В C ++ 0x было сделано исключение для этого особого случая, но общее правило все еще применяется (см. 2.5.3). Например, +++ будет проанализирован как ++ с последующим +, а не наоборот

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