Есть ли пример, что тройной двоеточие (:: :) является допустимым синтаксисом в коде c ++?

Похоже, я видел нечто подобное:

A:::b()

Но я не помню, если это c ++, также после поиска «тройное двоеточие» в c ++, но кажется редкой информацией об этом в c ++, есть ли пример, что код может иметь 3 двоеточия (:: 🙂 в коде, который действительный синтаксис?

1

Решение

Учитывая глобальную функцию b:

int b() {
return 5;
}

Есть два (на самом деле еще пара за ответ Стивена, если вы проявите творческий подход1) случаи, когда это будет работать, но только с пробелом:

  1. Как ярлык:

    int main() {
    A: ::b();
    }
    
  2. Как часть условного выражения:

    int main() {
    int A = 0;
    int result = true ? A: ::b();
    }
    

Причина в том, что пространство необходимо, потому что лексирование в C ++ является жадным и всегда лексическим ::: как :: с последующим :, никогда : с последующим ::, (Заметным исключением из этого является >> разрешено заканчивать два списка параметров / аргументов шаблона только после специального изменения C ++ 11.)


1: см. Примеры модификаторы доступа, наследование, список инициализатора конструктора.

5

Другие решения

Это немного не по теме, потому что это относится к встроенной сборке, а не к C ++ как таковой. Тем не менее, вот совет для тех, кто попал сюда (как и я), увидев этот оператор в следующем выражении:

asm volatile("" ::: "memory");

Этот синтаксис используется gcc, чтобы сообщить компилятор создать «барьер памяти». Википедия Упорядочение памяти Тема — лучшее объяснение, чем я могу предоставить.

4

Да, есть допустимые программы на C ++, которые включают последовательность символов ::: (за пределами комментариев и цитируемых литералов).

Обычно эта последовательность будет анализироваться как :: токен (оператор разрешения области видимости), за которым следует : маркер. Насколько я знаю, не существует действительной программы на С этой формы, потому что : может предшествовать только имя (как метка) или выражение (либо в case метка или как часть троичного ?: оператор). А также :: не может быть последним токеном в выражении.

Вы можете заставить лексический анализатор произвести : с последующим :: но только помещая пробел между двумя токенами, делая : ::, И, конечно, вы можете использовать препроцессор для определения макроса, который игнорирует или структурирует аргумент, поэтому ::: может появиться в качестве аргумента для такого макроса.

Оставляя их в стороне, насколько я знаю, единственная возможность, когда первый : это второй символ в <: маркер. Например:

const int size = 42;
int A<:::size:>;

(Жить на колиру.)

Если это выглядит странно, помните, что <: это альтернативное написание для [ а также :> это альтернативное написание для ], Унарный оператор разрешения области :: указывает, что имя, которое оно квалифицирует, находится в глобальной области видимости.

Любопытно, <:: является исключением из правила максимального жаворонка, если оно не с последующим : или же >в этом случае он должен быть проанализирован как < с последующим :: а не как <: с последующим :, Однако, когда это сопровождается : (как указано выше) или >, максимальный Munch все еще применяется, и первый токен <:,

3

Нет, в C ++ нет тройного двоеточия (:: 🙂 как оператора

Есть оператор разрешения области, это двойное двоеточие (: :).

Есть одна двоеточие (:), которое вы можете видеть вместе со спецификаторами доступа, такими как private, public и protected. А также в пределах синтаксис конструктора

0
По вопросам рекламы [email protected]