模板和lambda与Clang的编译错误

时间:2015-05-08 21:47:34

标签: c++ c++14 clang++

我正在尝试使用看起来像这样的代码编译项目

#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中隐式捕获   没有指定capture-default

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

1 个答案:

答案 0 :(得分:5)

缩减为:

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

int main()
{
    start(0);
}

generates the same error in non-trunk versions of clang

这似乎是由a bug in Clang's handling of a non-init-capture of an init-capture引起的。昨天,5月7日修复了这个bug,当前的Clang主干版本正确编译了上面的代码。

由于此错误仅表现为初始捕获的非初始捕获,因此一个简单的解决方法是在内部lambda中使用init-capture - 而不是[a],执行[a = a]