其他分享
首页 > 其他分享> > c – 为什么我必须用括号表示逗号表达式的初始化表达式?

c – 为什么我必须用括号表示逗号表达式的初始化表达式?

作者:互联网

煮一个问题我已经了解它的本质,我可以通过首先在逗号表达式中执行do-nothing lambda来将变量初始化为int,如下所示:

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

但如果我没有将初始化表达式括起来,

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

所有gcc,clang和MSVC都抱怨尝试使用void表达式初始化y.

为什么我必须用逗号表达式括起来将它用作初始值设定项?

解决方法:

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

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]):

simple-declaration:
    decl-specifier-seqopt init-declarator-listopt ;
    attribute-specifier-seq decl-specifier-seqopt init-declarator-list ;

init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator

init-declarator:
    declarator initializeropt

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

标签:c,initialization,comma-operator
来源: https://codeday.me/bug/20190829/1760400.html