范围解析运算符之前/之后的空格

时间:2014-08-22 16:54:11

标签: c++ language-lawyer

C ++语言中的哪些规则允许在范围解析运算符::之后出现空格?

即。以下compiles without a warning

#include <string>
#include <iostream>

int main ()
{
    std::    string s = "Hello";
    std::    cout << s << std     ::endl;
}

3 个答案:

答案 0 :(得分:6)

通常,您可以在令牌之间放置尽可能多的空间。在某些情况下,空间是必要的(例如,分隔标识符);在其他情况下,它是可选的(例如在标识符和运算符之间)。

这在C ++ 11 2.7中有描述:

  

空白,   水平和垂直制表符,换行符,换页符和注释(统称为“空格”),如上所述   在下面,将被忽略,除非它们用于分隔令牌。 [注意:需要一些空格来分隔其他相邻的标识符,关键字,数字文字和包含字母的替代标记   字符。 - 结束记录]

答案 1 :(得分:4)

范围解析运算符的语法规则如下:

:: <identifier>
<class-name> :: <identifier>
<namespace> :: <identifier>
<enum class> :: <identifier>
<enum struct> :: <identifier>

在所有五种情况下,您都可以看到::运算符的使用方式与使用C ++的其他一元和二元运算符的方式相同,这意味着一般规则也适用于它。也就是说,您可以在这些令牌之间拥有尽可能多的空白字符。

答案 2 :(得分:3)

引用C ++标准中的两个引用

就足够了
  

2.7 Tokens [lex.token] 1有五种标记:标识符,关键字,文字,18个运算符和其他分隔符。空白,   水平和垂直制表符,换行符,换页符和注释   (如下所述,除此之外)忽略了(统称为“白色空间”)   因为它们用来分隔代币。

     

2.13运算符和标点符号1 C ++程序的词汇表示包括许多用于的预处理标记   预处理器的语法或转换为令牌   运营商和标点符号

     

preprocessing-op-or-punc:

之一
::
  

每个preprocessing-op-or-punc都转换为单个令牌   翻译阶段7 ::