gpt4 book ai didi

c++ - Lambda 隐式捕获因从结构化绑定(bind)声明的变量而失败

转载 作者:可可西里 更新时间:2023-11-01 16:23:48 26 4
gpt4 key购买 nike

使用以下代码,我得到一个编译错误 C2065 'a': undeclared identifier(使用 visual studio 2017):

[] {
auto [a, b] = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }(); //error C2065
}();

但是,下面的代码可以编译:

[] {
int a, b;
std::tie(a, b) = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }();
}();

我认为这两个样本是等价的。是编译器错误还是我遗漏了什么?

最佳答案

Core issue 2313更改了标准,以便结构化绑定(bind)永远不会是变量的名称,从而使它们永远无法捕获。

P0588R1对 lambda 捕获措辞的重新表述使这一禁令变得明确:

If a lambda-expression [...] captures a structured binding (explicitly or implicitly), the program is ill-formed.

请注意,这个措辞应该是一个占位符,而委员会会弄清楚这种捕获应该如何工作。

由于历史原因保留之前的答案:


这在技术上应该可以编译,但是这里的标准中存在一个错误。

标准说 lambda 只能捕获变量。它说非元组类结构化绑定(bind)声明不会引入变量。它引入了名称,但这些名称不是变量名称。

另一方面,类似元组的结构化绑定(bind)声明确实引入了变量。 auto [a, b] = std::make_tuple(1, 2); 中的 ab 是实际的引用类型变量。所以它们可以被 lambda 捕获。

显然这不是一个理智的事态,委员会知道这一点,因此应该会尽快修复(尽管对于捕获结构化绑定(bind)应该如何工作似乎存在一些分歧)。

关于c++ - Lambda 隐式捕获因从结构化绑定(bind)声明的变量而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50799719/

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