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上编译都很好,这意味着&=并不总是作为运算符进行词法配对.
为什么它适用于右值参考,而不是左值参考,标准对此有何看法?
解析器只是从左到右工作,无论关联性如何,因此在第一个示例中,它找到的第一个完整标记是&=.(此时,解析器还没有检查更大的构造,所以它只知道那里有那个令牌.)
在第二个示例中,它找到的令牌是&&.因为&&=不是象征!
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |