3

将我遇到的问题归结为本质,我可以通过首先在逗号表达式中执行无操作 lambda 来将变量初始化为 int,如下所示:

int main(){
  auto x = ( []{}(), 10 );          // same effect as auto x = 10;
}

但是如果我不给初始化表达式加上括号,

int main(){
  auto y = []{}(), 10;              // won't compile
}

所有 gcc、clang 和 MSVC 都抱怨尝试y使用void表达式进行初始化。

为什么我必须给逗号表达式加上括号才能将其用作初始值设定项?

4

1 回答 1

5

在声明中,,符号分隔声明符。一个更简单的例子:

int i = 2, j = 3;     // OK: declares `i` and `j`
int i = 2, 3;         // Error: `3` is not a declarator

在第二种情况下,它看起来模棱两可。是,分隔声明符,还是,表达式的一部分2, 3

为了解决这种歧义,我们可以参考语言语法(C++14 [dcl.decl]):

简单声明:
    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-declarator

init-declarator:
    声明器初始化器opt

语法的工作方式,这意味着在解析声明时,会考虑匹配init-declarator,的最长可能序列。(这有时被称为“最大咀嚼原则”)。所以int i = 2,匹配init-declarator,。然后3无法匹配init-declarator,因此解析失败。

于 2016-02-04T20:36:26.343 回答