必须&=始终被解释为运营商?

chr*_*ris 11 c++ reference lexical-analysis language-lawyer

我正在编码并意外地在常量引用和默认值之间留下了空格.我很惊讶地看到它在Intellisense中出现错误,所以我编译了它,当然,它在GCC 4.3.4,4.5.1或4.7.2中不起作用,并且不起作用Visual Studio 2012也是.

这是一个演示错误的等效示例:

struct S {
    S(const int &= 5){}    
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

这会在GCC中产生以下错误,并在MSVC中产生类似的错误:

错误:在'&='标记之前预期','或'...'

我认为这是因为&=被视为操作员,但我不知道在标准中搜索的确切内容以查找有关此案例的更多信息.&=只提供运营商特定的信息.

好奇,我决定把它换成右值参考:

S(int &&= 5){}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这在GCC 4.7.2和MSVC上编译都很好,这意味着&=并不总是作为运算符进行词法配对.

为什么它适用于右值参考,而不是左值参考,标准对此有何看法?

rua*_*akh 13

这通常被称为"最长匹配的原则",或"最大的蒙克".因为&&是有效的令牌而&&=不是(没有复合赋值表示法&&),所以最长的令牌&&=&&; 在被删除之后,没有机会&=被视为单一令牌.

这个原则在许多语言中都很常见,尽管通常有例外.例如,在C++ 11,>>将被分析>,然后>在类似于上下文std::vector<std::vector<int>>.


Mr *_*ter 5

解析器只是从左到右工作,无论关联性如何,因此在第一个示例中,它找到的第一个完整标记是&=.(此时,解析器还没有检查更大的构造,所以它只知道那里有那个令牌.)

在第二个示例中,它找到的令牌是&&.因为&&=不是象征!