Kno*_*abe 3 c++ initialization comma-operator
煮一个问题我已经了解它的本质,我可以通过首先在逗号表达式中执行do-nothing lambda来将变量初始化为int,如下所示:
int main(){
auto x = ( []{}(), 10 ); // same effect as auto x = 10;
}
Run Code Online (Sandbox Code Playgroud)
但如果我没有将初始化表达式括起来,
int main(){
auto y = []{}(), 10; // won't compile
}
Run Code Online (Sandbox Code Playgroud)
所有gcc,clang和MSVC都抱怨尝试y用void表达式初始化.
为什么我必须将逗号表达式括起来以将其用作初始值设定项?
在声明中,,符号分隔声明符.一个更简单的例子:
int i = 2, j = 3; // OK: declares `i` and `j`
int i = 2, 3; // Error: `3` is not a declarator
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,它看起来很模糊.是,分离声明符,还是,表达式的一部分2, 3?
要解决这种歧义,我们可以参考语言语法(C++ 14 [dcl.decl]):
simple-declaration:
decl-specifier-seq opt init-declarator-list opt;
attribute-specifier-seq decl-specifier-seq opt init-declarator-list;init-declarator-list:
init-declarator
init-declarator-list,init-declaratorinit-declarator:
声明符初始化器选择
语法的工作方式,这意味着在解析声明时,会考虑与init-declarator,匹配的最长序列.(这有时被称为"最大咀嚼原则").所以int i = 2,匹配init-declarator,.然后3无法匹配init-declarator,因此解析失败.