gpt4 book ai didi

c++ - 为什么 ISO c++17 不允许在条件中进行结构化绑定(bind)声明?

转载 作者:行者123 更新时间:2023-12-05 01:22:32 28 4
gpt4 key购买 nike

如果我使用结构化绑定(bind)声明作为条件,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})auto [i] = A{0} 是条件,而不是 init-语句condition定义为

condition:
expression
attribute-specifier-seq(opt) decl-specifier-seq declarator brace-or-equal-initializer

并且不允许作为 grammar for that 的结构化绑定(bind)是

attribute-specifier-seq(opt) decl-specifier-seq ref-qualifier(opt) [ identifier-list ] initializer ;

好消息是你可以通过在你的 if 语句中添加一个条件来得到你想要的东西,比如

if (auto [i] = A{0}; i)

关于c++ - 为什么 ISO c++17 不允许在条件中进行结构化绑定(bind)声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73820660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com