在c++代码中是否有任何例子表明三重冒号(:::)是有效的语法?

Is there any example that triple colon (:::) is a valid syntax in c++ code?

本文关键字:三重 语法 有效 是否 代码 c++ 任何例      更新时间:2023-10-16

在我的印象中,我似乎看到了这样的东西:

A:::b()

但我不记得是不是c++,也在c++中搜索了"三重冒号"之后,但在c++中似乎很少有关于它的信息,是否有任何例子表明代码可以有3个冒号(:::)在代码中是有效的语法?

这有点偏离主题,因为它指的是内联汇编而不是c++本身。但是,这里有一个提示给那些在看到下面表达式中的这个操作符后到达这里的人(就像我一样):

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

这个语法被gcc用来告诉编译器创建一个'内存屏障'。维基百科的内存排序主题比我能提供的更好的解释

给定全局函数b:

int b() {
    return 5;    
}

有两种情况(实际上,如果你有创造性的1的话,stephen的答案会有更多)可以这样做,但只有一个空格:

  1. 作为标签:

    int main() {
        A: ::b();
    }
    
  2. 作为条件表达式的一部分:

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

之所以需要这个空间是因为c++的词法是贪婪的,总是将:::词法为::跟着:,而不是:跟着::。(一个值得注意的例外是>>只允许结束两个模板形参/实参列表,因为c++ 11有一个特殊的变化。)


1:参见访问修饰符、继承、构造函数初始化列表的示例。

是的,有一些有效的c++程序包含:::字符序列(除了注释和引号外)。

通常,该序列将被词法分析为::令牌(范围解析操作符)后跟:令牌。据我所知,没有这种形式的有效C程序,因为:之前只能有名称(作为标签)或表达式(在case标签中或作为三元?:操作符的一部分)。::不能作为表达式中的最后一个符号。

可以强制词法分析器生成:后跟::,但只能在两个标记之间放置空格,生成: ::。当然,您可以使用预处理器来定义一个宏,该宏忽略或字符串化参数,因此:::可以作为这样一个宏的参数出现。

把这些放在一边,据我所知,唯一的可能性是当第一个:<:令牌中的第二个字符时。例如:

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

(Live on coliru.)

如果这看起来很奇怪,请记住<:[的另一种拼写,:>]的另一种拼写。一元范围解析运算符::表示它所限定的名称在全局范围内。

奇怪的是,如果不是后面跟着:>,那么<::是maximum -munch规则的例外,在这种情况下,它必须被分析为<后面跟着::,而不是<:后面跟着:。但是,当它后面跟着:(如上所述)或>时,maxmaxunch仍然适用,并且第一个标记是<:

不,c++中没有三元冒号(:::)作为操作符

有一个范围解析操作符,它是双冒号(::)。

有一个单冒号(:),你可以看到与访问说明符,如private, public和protected。在构造函数语法中