Похоже, я видел нечто подобное:
A:::b()
Но я не помню, если это c ++, также после поиска «тройное двоеточие» в c ++, но кажется редкой информацией об этом в c ++, есть ли пример, что код может иметь 3 двоеточия (:: 🙂 в коде, который действительный синтаксис?
Учитывая глобальную функцию b
:
int b() {
return 5;
}
Есть два (на самом деле еще пара за ответ Стивена, если вы проявите творческий подход1) случаи, когда это будет работать, но только с пробелом:
Как ярлык:
int main() {
A: ::b();
}
Как часть условного выражения:
int main() {
int A = 0;
int result = true ? A: ::b();
}
Причина в том, что пространство необходимо, потому что лексирование в C ++ является жадным и всегда лексическим :::
как ::
с последующим :
, никогда :
с последующим ::
, (Заметным исключением из этого является >>
разрешено заканчивать два списка параметров / аргументов шаблона только после специального изменения C ++ 11.)
1: см. Примеры модификаторы доступа, наследование, список инициализатора конструктора.
Это немного не по теме, потому что это относится к встроенной сборке, а не к C ++ как таковой. Тем не менее, вот совет для тех, кто попал сюда (как и я), увидев этот оператор в следующем выражении:
asm volatile("" ::: "memory");
Этот синтаксис используется gcc, чтобы сообщить компилятор создать «барьер памяти». Википедия Упорядочение памяти Тема — лучшее объяснение, чем я могу предоставить.
Да, есть допустимые программы на C ++, которые включают последовательность символов :::
(за пределами комментариев и цитируемых литералов).
Обычно эта последовательность будет анализироваться как ::
токен (оператор разрешения области видимости), за которым следует :
маркер. Насколько я знаю, не существует действительной программы на С этой формы, потому что :
может предшествовать только имя (как метка) или выражение (либо в case
метка или как часть троичного ?:
оператор). А также ::
не может быть последним токеном в выражении.
Вы можете заставить лексический анализатор произвести :
с последующим ::
но только помещая пробел между двумя токенами, делая : ::
, И, конечно, вы можете использовать препроцессор для определения макроса, который игнорирует или структурирует аргумент, поэтому :::
может появиться в качестве аргумента для такого макроса.
Оставляя их в стороне, насколько я знаю, единственная возможность, когда первый :
это второй символ в <:
маркер. Например:
const int size = 42;
int A<:::size:>;
Если это выглядит странно, помните, что <:
это альтернативное написание для [
а также :>
это альтернативное написание для ]
, Унарный оператор разрешения области ::
указывает, что имя, которое оно квалифицирует, находится в глобальной области видимости.
Любопытно, <::
является исключением из правила максимального жаворонка, если оно не с последующим :
или же >
в этом случае он должен быть проанализирован как <
с последующим ::
а не как <:
с последующим :
, Однако, когда это сопровождается :
(как указано выше) или >
, максимальный Munch все еще применяется, и первый токен <:
,
Нет, в C ++ нет тройного двоеточия (:: 🙂 как оператора
Есть оператор разрешения области, это двойное двоеточие (: :).
Есть одна двоеточие (:), которое вы можете видеть вместе со спецификаторами доступа, такими как private, public и protected. А также в пределах синтаксис конструктора