模板和lambda与Clang的编译错误

Nat*_*Nat 1 c++ clang++ c++14

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

#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{});
}
Run Code Online (Sandbox Code Playgroud)

似乎在GCC 4.9.1中编译良好,但在Clang 3.4,3.5,3.6中没有编译.错误消息是

错误:变量'args'不能在没有指定capture-default的lambda中隐式捕获

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

T.C*_*.C. 5

减少到:

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

int main()
{
    start(0);
}
Run Code Online (Sandbox Code Playgroud)

在clang的非主干版本中会产生相同的错误.

这似乎是由Clang处理init-capture的非初始捕获错误引起的.昨天,5月7日修复了错误,当前的Clang主干版本正确编译了上面的代码.

由于该错误只体现为初始化,捕获的非初始化,捕获,一个简单的解决方法是使用在内部拉姆达以及一个init捕获-代替[a],这样做[a = a].

  • @Nat除非你知道要找什么,否则很难找到:) (2认同)