【问题标题】:Structured binding violations结构化绑定违规
【发布时间】:2021-06-08 08:02:55
【问题描述】:

代码如下

#include <tuple>
 
int main() 
{
    auto [a] = std::make_tuple(1);
    return [a]() -> int { return a; }();
}

在 clang 12 中产生错误:

<source>:6:13: error: 'a' in capture list does not name a variable
    return [a]() -> int { return a; }();
<source>:6:34: error: reference to local binding 'a' declared in enclosing function 'main'
    return [a]() -> int { return a; }();

但是,Visual Studio 2019 和 gcc 11 都使用 -std=c++20 -Wall -Wextra -pedantic-errors 接受它。 https://gcc.godbolt.org/z/jbjsnfWfj

所以它们仍然违反了结构化绑定永远不是变量名称的规则,使它们永远不可捕获?

【问题讨论】:

    标签: c++ c++20 stdtuple structured-bindings


    【解决方案1】:

    所以它们仍然违反了结构化绑定永远不是变量名称的规则,使它们永远不可捕获?

    不,实际上是 clang 违反了标准,至少对于提供的编译器标志而言。 在 C++20 中,不直接支持捕获结构化绑定别名 has been lifted 的限制,允许直接使用它们而无需回退到使用 init-captures 的构造:

    将 [expr.prim.lambda.capture]p8 (7.5.5.2) 修改如下:

    如果一个 lambda 表达式显式地捕获了一个不可通过 odr 使用的实体或捕获了一个结构化绑定(显式或隐式) , 程序格式不正确。

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 2023-04-10
      • 2017-05-15
      • 2017-04-02
      • 1970-01-01
      • 2022-12-15
      相关资源
      最近更新 更多