我试图在内部lambda中捕获一个可变参数的lambda参数,并在其中使用它。 作为示例,请考虑以下代码:
int main () {
auto first = [&] (auto&&... one) {
auto second = [&] (auto&&... two) {
return ((one * two) + ...);
};
return second(one...);
};
return first(5);
}
这适用于gcc9,但不适用于clang8(https://godbolt.org/z/i2K9cK)。
一种用于编译代码的方法是显式捕获[&one...]
,但我想知道这是否是clang中的错误。
同样有趣的是:将return语句更改为直接扩展one
的地方(与two
组合之前),它将再次编译:
return (((one * ...) * two) + ...);
我发现了this个相关的帖子,但声明的错误似乎已在clang8中修复。
答案 0 :(得分:1)
这是Clang中的错误。已经是reported。根据{{3}}:
已在r362358中修复。
(附带说明:Clang似乎在捕获中通常难以扩展包。让我们推出为通用lambda first
生成的闭包类型的自己版本:
struct __closure_first {
template <typename... Args>
auto operator()(Args&&... one) const
{
auto second = [&] (auto&&... two) {
return ((one * two) + ...);
};
return second(one...);
}
};
很显然,这不是真正的闭包类型,并且非闭包本地类不能具有成员函数模板。将其放在全局范围comment和GCC still works中。)