【发布时间】:2018-02-17 05:54:59
【问题描述】:
使用以下代码,我得到一个编译错误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; }();
}();
我认为这两个样本是等价的。是编译器错误还是我遗漏了什么?
【问题讨论】:
-
gcc 8.1.1 编译没有抱怨。 clang 6.0.1 报错。
-
AFAICS,事实上(我也可以证明)这在
-std=c++17模式下现在可以在g++8 中工作,这意味着(A)某些修复已被视为缺陷并向后移植,其中我找不到任何直接的迹象,或者 (B)g++可能允许它作为扩展,甚至是无意的。 -
C++20 允许捕获结构化绑定(如果按值单独复制它们)。
-
@ThreeStarProgrammer57: Yes;请注意,此处引入的通过引用捕获它们的限制后来被删除(在进一步分析确定不需要其他更改来正确支持它们之后)。
标签: c++ lambda visual-studio-2017 c++17 structured-bindings