如果我使用结构化绑定声明作为条件,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中没有看到这种情况;在哪里可以看到这是被禁止的呢?
此外:禁止这样做的理由是什么?
发布于 2022-09-22 21:27:17
if语句的语法是
if constexpr(opt) ( init-statement(opt) condition) statement如您所见,condition是必需的,而init-statement是可选的。这意味着在if (auto [i] = A{0})中,auto [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)https://stackoverflow.com/questions/73820660
复制相似问题