在我的印象中我好像看到过这样的事情:
A:::b()
但我不记得它是否是c++,也在c中搜索了“三冒号”,但似乎很少有关于它的信息,在c中,有没有任何例子表明代码中可以有3个冒号(:::),这是有效的语法?
ua4mk5z41#
这有点离题,因为它指的是内联汇编,而不是C++本身。但是,对于那些在下面的表达式中看到这个运算符后才来到这里的人(像我一样),这里有一个提示:
asm volatile("" ::: "memory");
这个语法被gcc用来告诉 * 编译器 * 创建一个“内存障碍”。维基百科的内存排序主题是一个比我能提供的更好的解释。
icomxhvb2#
给定全局函数b:
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 modifiers、inheritance和constructor initializer list的示例。
:::
::
:
>>
ffscu2ro3#
是的,存在包含字符序列:::的有效C++程序(注解和带引号的文字除外)。通常,该序列将作为::标记进行词法分析(作用域解析操作符)后接一个:标记。据我所知,没有这种形式的有效C程序,因为:前面只能有一个名称(作为标签)或表达式(在case标签中或作为三元?:运算符的一部分)。并且::不能是表达式中的最后一个标记。你可以强制词法分析器生成一个:,后面跟着一个::,但必须在两个标记之间放置空格,使之成为: ::。当然,你可以使用预处理器定义一个宏,忽略或字符串化一个参数,这样:::就可以作为这样一个宏的参数出现。撇开这些不谈,据我所知,唯一的可能性是当第一个:是<:标记中的第二个字符时。
case
?:
: ::
<:
const int size = 42; int A<:::size:>;
(x一e0一f1 x.)如果这看起来很奇怪,请记住<:是[的另一种拼写,:>是]的另一种拼写,一元作用域解析操作符::表示它所限定的名称在全局作用域中。奇怪的是,如果<::后面是:或>,则它是最大咀嚼规则的例外,在这种情况下,它必须被分析为<后面是::,而不是<:后面是:。(如上所述)或>,最大咀嚼仍然适用,并且第一令牌是<:。
[
:>
]
<::
>
<
0kjbasz64#
不,在C++中没有三冒号(:::)作为运算符有scope resolution operator,它是双冒号(::)。在constructor syntax中,您可以看到单个冒号(:)以及private、public和protected等访问说明符
4条答案
按热度按时间ua4mk5z41#
这有点离题,因为它指的是内联汇编,而不是C++本身。但是,对于那些在下面的表达式中看到这个运算符后才来到这里的人(像我一样),这里有一个提示:
这个语法被gcc用来告诉 * 编译器 * 创建一个“内存障碍”。维基百科的内存排序主题是一个比我能提供的更好的解释。
icomxhvb2#
给定全局函数
b
:有两种情况(如果你有创造力的话,斯蒂芬的答案实际上还有几种)可以做到这一点,但前提是要有一个空格:
1.作为标签:
1.作为条件表达式的一部分:
之所以需要这个空间是因为C++ lexing是贪婪的,它总是将
:::
lexing为::
后接:
,而从不将:
后接::
(一个值得注意的例外是,只有在C++11做了特殊更改后,>>
才被允许结束两个模板参数/实参列表)。1:请参见access modifiers、inheritance和constructor initializer list的示例。
ffscu2ro3#
是的,存在包含字符序列
:::
的有效C++程序(注解和带引号的文字除外)。通常,该序列将作为
::
标记进行词法分析(作用域解析操作符)后接一个:
标记。据我所知,没有这种形式的有效C程序,因为:
前面只能有一个名称(作为标签)或表达式(在case
标签中或作为三元?:
运算符的一部分)。并且::
不能是表达式中的最后一个标记。你可以强制词法分析器生成一个
:
,后面跟着一个::
,但必须在两个标记之间放置空格,使之成为: ::
。当然,你可以使用预处理器定义一个宏,忽略或字符串化一个参数,这样:::
就可以作为这样一个宏的参数出现。撇开这些不谈,据我所知,唯一的可能性是当第一个
:
是<:
标记中的第二个字符时。(x一e0一f1 x.)
如果这看起来很奇怪,请记住
<:
是[
的另一种拼写,:>
是]
的另一种拼写,一元作用域解析操作符::
表示它所限定的名称在全局作用域中。奇怪的是,如果
<::
后面是:
或>
,则它是最大咀嚼规则的例外,在这种情况下,它必须被分析为<
后面是::
,而不是<:
后面是:
。(如上所述)或>
,最大咀嚼仍然适用,并且第一令牌是<:
。0kjbasz64#
不,在C++中没有三冒号(:::)作为运算符
有scope resolution operator,它是双冒号(::)。
在constructor syntax中,您可以看到单个冒号(:)以及private、public和protected等访问说明符