在我的印象中,我似乎看到了类似的东西:
A:::b()
但是我不记得它是否是c ++,也是在c ++中搜索过“三重冒号”之后但是在c ++中似乎很少有关于它的信息,是否有任何代码可以在代码中有3个冒号(:: :)代码是有效的语法吗?
答案 0 :(得分:5)
给定全局函数A
:
b
有两个(实际上,如果你有创意 1 的话,每个Steephen的答案会多一些)这样做会有效,但只有空格:
作为标签:
int b() {
return 5;
}
作为条件表达式的一部分:
int main() {
A: ::b();
}
需要空间的原因是因为C ++ lexing是贪婪的并且始终将int main() {
int A = 0;
int result = true ? A: ::b();
}
称为:::
后跟::
,而:
后跟:
。 (值得注意的例外是::
仅允许结束两个模板参数/参数列表,因为特殊更改C ++ 11。)
1:查看access modifiers,inheritance,constructor initializer list的示例。
答案 1 :(得分:4)
这稍微偏离主题,因为它指的是内联汇编而不是C ++本身。但是,在以下表达式中看到此运算符之后,这里有一个提示(就像我做的那样):
asm volatile("" ::: "memory");
gcc使用此语法告诉编译器创建“内存屏障”。维基百科的Memory Ordering主题是一个比我能提供的更好的解释。
答案 2 :(得分:3)
是的,有一些有效的C ++程序包含字符序列:::
(在注释和引用的文字之外)。
通常,该序列将作为::
标记(范围解析运算符)进行词法分析,后跟:
标记。据我所知,此表单中没有有效的C程序,因为:
只能在名称(作为标签)或表达式(在case
标签中或三元?:
运算符的一部分。 ::
不能是表达式中的最后一个标记。
您可以强制词法分析器生成:
后跟::
,但只能在两个标记之间放置空格,然后生成: ::
。当然,您可以使用预处理器来定义一个忽略或字符串化参数的宏,因此:::
可以作为此类宏的参数出现。
将这些留在一边,据我所知,唯一的可能性是第一个:
是<:
令牌中的第二个字符。例如:
const int size = 42;
int A<:::size:>;
如果这看起来很奇怪,请记住<:
是[
的替代拼写,:>
是]
的替代拼写。一元范围解析运算符::
表示它符合条件的名称在全局范围内。
奇怪的是,如果不是后跟<::
或:
,则>
是最大匹配规则的例外情况,在这种情况下它必须是分析为<
后跟::
,而不是<:
,后跟:
。但是,如果后跟:
(如上所述)或>
,则仍然会应用最大值,而第一个令牌为<:
。
答案 3 :(得分:0)
不,C ++中没有三重冒号(:: :)作为运算符
有scope resolution operator,它是双冒号(::)。
您可以看到单个冒号(:)以及私有,公共和受保护等访问说明符。也在constructor syntax
之内