使用模板和lambda的汇编误差与clang

Compilation error with template and lambda with Clang

本文关键字:汇编 误差 clang lambda      更新时间:2023-10-16

我试图用看起来像

的代码编译一个项目
#include <tuple>
#include <utility>
struct Foo
{
};
template <typename... Args>
void start(Args&&... args) {
    auto x = [args = std::make_tuple(std::forward<Args>(args)...)] () mutable {
            auto y = [args] () mutable {
                auto z = [] (Args&&... args) {
                    return new Foo(std::forward<Args>(args)...);
                };
            };
    };
}
int main()
{
    start(Foo{});
}

它似乎在GCC 4.9.1中填充了,但在Clang 3.4、3.5、3.6中却没有编译。错误消息是

错误:变量'args'不能在lambda中隐式捕获 未指定捕获默认

是编译器错误吗?如果是这样,是否有任何解决方法可以使其在Clang上进行编译?

降低到:

template <typename T>
void start(T t) {
    [a = t] { [a]{}; };
}
int main()
{
    start(0);
}

在clang的非陷阱版本中生成相同的错误。

这似乎是由Clang处理非本地捕获的错误引起的。所述错误是昨天(5月7日)修复的,当前的TRUNK版本正确编译了上面的代码。

由于此错误仅适用于初始化的非本质捕获,因此一个简单的解决方法是在内部lambda中使用初始化 - 而不是 [a],do [a = a]