引用在封闭函数中声明的本地绑定

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,请纠正我错误。

编辑

你可以从其他的问题看,问题是,aunused变量(是的,锵是正确的!),但参考的名字,不能用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最好使用其他更清洁的解决方案。