请使用以下代码:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&] {
return a * 15;
}();
(void) unused;
}
不要担心unused
变量,我只想解构数组。
代码可以使用最新的GCC和MSVC编译,但是Clang refuses to compile。更改lambda的捕获列表不会改变任何内容。有趣的是,在捕获列表中明确设置a
会引发a is not a variable
。
我很确定这是一个错误,但我想问一下,主要是因为AFAIK a
是对数组第一个元素的引用(生命周期延伸到main
范围这个案例),不只是int
,如果我错了,请纠正我。
从其他问题可以看出,问题是a
和unused
不是变量(是的,Clang是对的!),但引用名称,lambdas无法捕获。然而,如果你真的需要这样的东西,你可以使用lambda的局部变量,如下所示:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&, a = a] {
return a * 15;
}();
(void) unused;
}
在这种情况下,对象被复制,这对于简单的可复制对象来说很好。在其他情况下,您可以使用类似
的内容[&, r = std::ref(uncopiable_obj)] {
return r.get().do_something();
}();
说,我不喜欢这些解决方法,因为它们非常不清楚并且降低了代码的表现力。 IHMO最好使用其他更清洁的解决方案。