在c++代码中,有没有三个冒号(:::)是有效语法的例子?

dphi5xsq  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(138)

在我的印象中我好像看到过这样的事情:

A:::b()

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

ua4mk5z4

ua4mk5z41#

这有点离题,因为它指的是内联汇编,而不是C++本身。但是,对于那些在下面的表达式中看到这个运算符后才来到这里的人(像我一样),这里有一个提示:

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

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

icomxhvb

icomxhvb2#

给定全局函数b

int b() {
    return 5;    
}

有两种情况(如果你有创造力的话,斯蒂芬的答案实际上还有几种)可以做到这一点,但前提是要有一个空格:
1.作为标签:

int main() {
    A: ::b();
}

1.作为条件表达式的一部分:

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

之所以需要这个空间是因为C++ lexing是贪婪的,它总是将::: lexing为::后接:,而从不将:后接::(一个值得注意的例外是,只有在C++11做了特殊更改后,>>才被允许结束两个模板参数/实参列表)。
1:请参见access modifiersinheritanceconstructor initializer list的示例。

ffscu2ro

ffscu2ro3#

是的,存在包含字符序列:::的有效C++程序(注解和带引号的文字除外)。
通常,该序列将作为::标记进行词法分析(作用域解析操作符)后接一个:标记。据我所知,没有这种形式的有效C程序,因为:前面只能有一个名称(作为标签)或表达式(在case标签中或作为三元?:运算符的一部分)。并且::不能是表达式中的最后一个标记。
你可以强制词法分析器生成一个:,后面跟着一个::,但必须在两个标记之间放置空格,使之成为: ::。当然,你可以使用预处理器定义一个宏,忽略或字符串化一个参数,这样:::就可以作为这样一个宏的参数出现。
撇开这些不谈,据我所知,唯一的可能性是当第一个:<:标记中的第二个字符时。

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

(x一e0一f1 x.)
如果这看起来很奇怪,请记住<:[的另一种拼写,:>]的另一种拼写,一元作用域解析操作符::表示它所限定的名称在全局作用域中。
奇怪的是,如果<::后面是:>,则它是最大咀嚼规则的例外,在这种情况下,它必须被分析为<后面是::,而不是<:后面是:。(如上所述)或>,最大咀嚼仍然适用,并且第一令牌是<:

0kjbasz6

0kjbasz64#

不,在C++中没有三冒号(:::)作为运算符
scope resolution operator,它是双冒号(::)。
constructor syntax中,您可以看到单个冒号(:)以及private、public和protected等访问说明符

相关问题