Kie*_*etz 3 c++ language-lawyer
如果我使用结构化绑定声明作为条件,Clang 会发出警告:
$ cat hello.cc
int main() {
  struct A { int i; operator bool() { return true; } };
  if (auto [i] = A{0}) {
    return i;
  }
  return -1;
}
$ clang++-10 -std=c++17 hello.cc
hello.cc:3:12: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]                                                                                                                                                                               
  if (auto [i] = A{0}) {                                                                                                                                                                                                                                                                               
           ^~~                                                                                                                                                                                                                                                                                         
1 warning generated.
我在dcl.struct.bind或stmt.select中没有看到这一点;我在哪里可以看到这是禁止的?
此外:禁止这样做的理由是什么?
if 语句的语法是
if constexpr(opt) ( init-statement(opt) condition) statement
正如您所看到的,condition这是必需的,而init-statement是可选的。这意味着if (auto [i] = A{0})thatauto [i] = A{0}是条件,而不是init-statment。  condition定义为
condition:
    expression
    attribute-specifier-seq(opt) decl-specifier-seq declarator brace-or-equal-initializer
并且不允许结构化绑定,因为其语法是
attribute-specifier-seq(opt) decl-specifier-seq ref-qualifier(opt) [ identifier-list ] initializer ;
好消息是,您可以通过在 if 语句中添加条件来获得您想要的结果,例如
if (auto [i] = A{0}; i)
| 归档时间: | 
 | 
| 查看次数: | 393 次 | 
| 最近记录: |