Да, существуют допустимые программы на C++, которые включают последовательность символов :::
(за исключением комментариев и литералов в кавычках).
Обычно эта последовательность лексически анализируется как токен ::
(оператор разрешения области действия), за которым следует токен :
. Насколько я знаю, не существует действительной программы на C такой формы, потому что :
может предшествовать только имя (как метка) или выражение (либо в метке case
, либо как часть тернарного оператора ?:
). И ::
не может быть последним токеном в выражении.
Вы можете заставить лексический анализатор выдать :
, за которым следует ::
, но только поместив пробел между двумя токенами, получив : ::
. И, конечно же, вы можете использовать препроцессор для определения макроса, который игнорирует или преобразует аргумент в строку, поэтому :::
может появиться в качестве аргумента для такого макроса.
Оставив это в стороне, насколько я знаю, единственная возможность - это когда первый :
является вторым символом в токене <:
. Например:
const int size = 42;
int A<:::size:>;
(Жить на coliru.)
Если это выглядит странно, помните, что <:
— это альтернативное написание для [
, а :>
— это альтернативное написание для ]
. Оператор разрешения унарной области ::
указывает, что определяемое им имя относится к глобальной области.
Любопытно, что <::
является исключением из правила максимального перекуса, если за ним не следует :
или >
, и в этом случае его следует анализировать как <
, за которым следует ::
, а не как <:
, за которым следует :
. Однако, когда за ним следует :
(как указано выше) или >
, максимальное жевание по-прежнему применяется, и первым токеном будет <:
.
person
rici
schedule
24.07.2015
A::b()
появляется довольно часто - person yizzlez   schedule 24.07.2015