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

时间:2018-06-11 14:08:33

标签: c++ c++17 clang++

请使用以下代码:

#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,如果我错了,请纠正我。

修改

从其他问题可以看出,问题是aunused不是变量(是的,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最好使用其他更清洁的解决方案。

0 个答案:

没有答案