【问题标题】:Is there any example that triple colon (:::) is a valid syntax in c++ code?是否有任何示例表明三重冒号 (:::) 是 C++ 代码中的有效语法?
【发布时间】:2023-03-14 09:12:01
【问题描述】:

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

A:::b()

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

【问题讨论】:

  • 你确定不是双冒号吗? A::b() 经常出现

标签: c++ syntax colon


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

给定一个全局函数b

int b() {
    return 5;    
}

有两种情况(如果您有创意1,根据 Steephen 的回答实际上还有更多)可行,但只能使用空格:

  1. 作为标签:

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

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

需要空间的原因是因为 C++ 词法分析是贪婪的,并且总是将 ::: 词法分析为 :: 后跟 :,而不是 : 后跟 ::。 (一个值得注意的例外是 >> 仅在 C++11 的特殊更改之后才允许结束两个模板参数/参数列表。)


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

【讨论】:

【解决方案3】:

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

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

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

撇开这些不谈,据我所知,唯一的可能是第一个 :<: 令牌中的第二个字符。例如:

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

(Live on coliru.)

如果这看起来很奇怪,请记住 &lt;:[ 的替代拼写,:&gt;] 的替代拼写。一元范围解析运算符:: 表示它限定的名称在全局范围内。

奇怪的是,&lt;:: 是最大咀嚼规则的一个例外,如果它 not 后跟 :&gt;,在这种情况下它必须被分析为 &lt; 后跟通过:: 而不是&lt;: 后跟:。但是,当它后面跟着:(如上)或&gt; 时,最大咀嚼仍然适用,第一个标记是&lt;:

【讨论】:

    【解决方案4】:

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

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

    您可以看到单个冒号 (:) 以及访问说明符,例如 private、public 和 protected。还有在constructor syntax

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多