簡體   English   中英

為什么 ISO c++17 不允許在條件中使用結構化綁定聲明?

[英]Why doesn't ISO c++17 permit a structured binding declaration in a condition?

如果我使用結構化綁定聲明作為條件,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.bindstmt.select中沒有看到這個; 我在哪里可以看到這是被禁止的?

此外:禁止這樣做的理由是什么?

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM