我正在编码并意外地在常量引用和默认值之间留下了空格。我很惊讶地看到它在Intellisense中出现错误,所以我编译了它,当然,它在GCC 4.3.4,4.5.1或4.7.2中不起作用,并且不起作用Visual Studio 2012,或者。
以下是演示错误的等效示例:
struct S {
S(const int &= 5){}
};
int main(){}
这会在GCC中产生以下错误,并在MSVC中产生类似的错误:
错误:在'& ='标记
之前预期','或'...'
我认为这是因为&=
被视为运算符,但我不知道在标准中要搜索的确切内容以查找有关此案例的更多信息。 & =只是提供运营商特定的信息。
好奇,我决定将它换成右值参考:
S(int &&= 5){}
奇怪的是,这在GCC 4.7.2和MSVC上编译都很好,这意味着& =并不总是作为运算符进行词法配对。
为什么它适用于右值参考,而不是左值参考,标准对此有何看法?
答案 0 :(得分:13)
这通常被称为“最长匹配原则”或"maximal munch"。由于&&
是有效令牌且&&=
不是(&&
没有复合指定表示法),&&=
开头的最长令牌是&&
;在删除之后,&=
没有机会被视为单一令牌。
这个原则在许多语言中都很常见,但通常有例外。例如,在C ++ 11中,>>
将在>
等上下文中被分析为>
,后跟std::vector<std::vector<int>>
。
答案 1 :(得分:5)
解析器只是从左到右工作,无论关联性如何,因此在第一个示例中,它找到的第一个完整标记是&=
。 (此时,解析器还没有检查更大的构造,所以它只知道那里有那个令牌。)
在第二个示例中,它找到的令牌是&&
。因为&&=
不是令牌!