【发布时间】:2023-03-14 09:12:01
【问题描述】:
在我的印象中,我似乎看到了类似的东西:
A:::b()
但我不记得它是否是 c++,也在 c++ 中搜索“三重冒号”但在 c++ 中似乎很少有关于它的信息,是否有任何示例代码中可以有 3 个冒号(:::)代码是合法的语法吗?
【问题讨论】:
-
你确定不是双冒号吗?
A::b()经常出现
在我的印象中,我似乎看到了类似的东西:
A:::b()
但我不记得它是否是 c++,也在 c++ 中搜索“三重冒号”但在 c++ 中似乎很少有关于它的信息,是否有任何示例代码中可以有 3 个冒号(:::)代码是合法的语法吗?
【问题讨论】:
A::b() 经常出现
这有点离题,因为它指的是内联汇编而不是 C++ 本身。但是,对于那些在以下表达式中看到此运算符后到达这里的人(就像我一样),这里有一个提示:
asm volatile("" ::: "memory");
gcc 使用此语法告诉编译器 创建一个“内存屏障”。 Wikipedia 的 Memory Ordering 主题是比我能提供的更好的解释。
【讨论】:
给定一个全局函数b:
int b() {
return 5;
}
有两种情况(如果您有创意1,根据 Steephen 的回答实际上还有更多)可行,但只能使用空格:
作为标签:
int main() {
A: ::b();
}
作为条件表达式的一部分:
int main() {
int A = 0;
int result = true ? A: ::b();
}
需要空间的原因是因为 C++ 词法分析是贪婪的,并且总是将 ::: 词法分析为 :: 后跟 :,而不是 : 后跟 ::。 (一个值得注意的例外是 >> 仅在 C++11 的特殊更改之后才允许结束两个模板参数/参数列表。)
1:查看access modifiers、inheritance、constructor initializer list 的示例。
【讨论】:
是的,有有效的 C++ 程序包含字符序列:::(在 cmets 和引用的文字之外)。
通常,该序列将作为:: 标记(范围解析运算符)后跟: 标记进行词法分析。据我所知,没有这种形式的有效 C 程序,因为 : 只能以名称(作为标签)或表达式(在 case 标签中或作为三元组的一部分?: 运营商)。并且:: 不能是表达式中的最后一个标记。
您可以强制词法分析器生成:,后跟::,但只能在两个标记之间放置空格,即: ::。而且,当然,您可以使用预处理器定义一个忽略或字符串化参数的宏,因此::: 可以作为此类宏的参数出现。
撇开这些不谈,据我所知,唯一的可能是第一个 : 是 <: 令牌中的第二个字符。例如:
const int size = 42;
int A<:::size:>;
如果这看起来很奇怪,请记住 <: 是 [ 的替代拼写,:> 是 ] 的替代拼写。一元范围解析运算符:: 表示它限定的名称在全局范围内。
奇怪的是,<:: 是最大咀嚼规则的一个例外,如果它 not 后跟 : 或 >,在这种情况下它必须被分析为 < 后跟通过:: 而不是<: 后跟:。但是,当它后面跟着:(如上)或> 时,最大咀嚼仍然适用,第一个标记是<:。
【讨论】:
不,C++ 中没有三冒号(:::) 作为运算符
有scope resolution operator,是双冒号(::)。
您可以看到单个冒号 (:) 以及访问说明符,例如 private、public 和 protected。还有在constructor syntax
【讨论】: