dod*_*ndi 11 c++ clang++ c++17
采取以下代码:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&] {
return a * 15;
}();
(void) unused;
}
Run Code Online (Sandbox Code Playgroud)
不用担心unused变量,我只想对数组进行解构。
使用最新的GCC和MSVC可以很好地编译代码,但是Clang 拒绝编译。更改lambda的捕获列表不会更改任何内容。有趣的是,a在捕获列表中显式设置会引发错误a is not a variable。
我很确定这是一个错误,但是我想问一下,主要是因为AFAIK a是对数组第一个元素的引用(main在这种情况下,生存期扩展到了范围),而不仅仅是一个int,请纠正我错误。
你可以从其他的问题看,问题是,a与unused不变量(是的,锵是正确的!),但参考的名字,不能用lambda表达式被捕获。不过,如果您确实需要这样的东西,可以为lambda使用局部变量,如下所示:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&, a = a] {
return a * 15;
}();
(void) unused;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将复制对象,这对于普通可复制的对象来说是很好的选择。在其他情况下,您可以使用类似
[&, r = std::ref(uncopiable_obj)] {
return r.get().do_something();
}();
Run Code Online (Sandbox Code Playgroud)
据说,我不喜欢这些解决方法,因为它们非常不清楚,并且降低了代码的表达能力。IHMO最好使用其他更清洁的解决方案。