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

По моему впечатлению кажется, что я видел что-то вроде этого:

A:::b()

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


person ggrr    schedule 24.07.2015    source источник
comment
Вы уверены, что это не двойное двоеточие? A::b() появляется довольно часто   -  person yizzlez    schedule 24.07.2015


Ответы (4)


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

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

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

person ptschnack    schedule 26.11.2015
comment
Если вас интересует сам синтаксис, проверьте этот gcc.gnu.org/onlinedocs /gcc/Extended-Asm.html - person debuti; 02.07.2021

Учитывая глобальную функцию 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: См. примеры модификаторов доступа, наследование, конструктор список инициализаторов.

person chris    schedule 24.07.2015
comment
принцип максимального жевания, который проявляется во множестве мест в C++. - person Shafik Yaghmour; 24.07.2015

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

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

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

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

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

(Жить на coliru.)

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

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

person rici    schedule 24.07.2015

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

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

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

person Steephen    schedule 24.07.2015