使用 Clang 的模板和 lambda 的编译错误
Compilation error with template and lambda with 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 中却不行。错误信息是
error: variable 'args' cannot be implicitly captured in a lambda with
no capture-default specified
这是编译器错误吗?如果是这样,是否有任何解决方法可以让它在 Clang 上编译?
减少到:
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 日)修复,当前主干版本的 Clang 可以正确编译上述代码。
由于此错误仅针对 init-captures 的非 init-captures 出现,一个简单的解决方法是在内部 lambda 中也使用 init-capture - 而不是 [a]
,执行 [a = a]
.
我试图用如下代码编译一个项目
#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 中却不行。错误信息是
error: variable 'args' cannot be implicitly captured in a lambda with no capture-default specified
这是编译器错误吗?如果是这样,是否有任何解决方法可以让它在 Clang 上编译?
减少到:
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 日)修复,当前主干版本的 Clang 可以正确编译上述代码。
由于此错误仅针对 init-captures 的非 init-captures 出现,一个简单的解决方法是在内部 lambda 中也使用 init-capture - 而不是 [a]
,执行 [a = a]
.