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

时间:2015-07-24 02:07:48

标签: c++ syntax colon

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

A:::b()

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

4 个答案:

答案 0 :(得分:5)

给定全局函数A

b

有两个(实际上,如果你有创意 1 的话,每个Steephen的答案会多一些)这样做会有效,但只有空格:

  1. 作为标签:

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

    int main() {
        A: ::b();
    }
    
  3. 需要空间的原因是因为C ++ lexing是贪婪的并且始终将int main() { int A = 0; int result = true ? A: ::b(); } 称为:::后跟::,而:后跟: 。 (值得注意的例外是::仅允许结束两个模板参数/参数列表,因为特殊更改C ++ 11。)

    1:查看access modifiersinheritanceconstructor initializer list的示例。

答案 1 :(得分:4)

这稍微偏离主题,因为它指的是内联汇编而不是C ++本身。但是,在以下表达式中看到此运算符之后,这里有一个提示(就像我做的那样):

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

gcc使用此语法告诉编译器创建“内存屏障”。维基百科的Memory Ordering主题是一个比我能提供的更好的解释。

答案 2 :(得分:3)

是的,有一些有效的C ++程序包含字符序列:::(在注释和引用的文字之外)。

通常,该序列将作为::标记(范围解析运算符)进行词法分析,后跟:标记。据我所知,此表单中没有有效的C程序,因为:只能在名称(作为标签)或表达式(在case标签中或三元?:运算符的一部分。 ::不能是表达式中的最后一个标记。

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

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

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

Live on coliru。)

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

奇怪的是,如果不是后跟<:::,则>是最大匹配规则的例外情况,在这种情况下它必须是分析为<后跟::,而不是<:,后跟:。但是,如果后跟:(如上所述)或>,则仍然会应用最大值,而第一个令牌为<:

答案 3 :(得分:0)

不,C ++中没有三重冒号(:: :)作为运算符

scope resolution operator,它是双冒号(::)。

您可以看到单个冒号(:)以及私有,公共和受保护等访问说明符。也在constructor syntax

之内