[英]clang vs gcc: variadic lambda captures
我试图在内部lambda中捕获一个variadic 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) + ...);
我找到了这个相关的帖子,但是在clang8中似乎修复了那里声明的bug。
已在r362358中修复。
(附注:锵似乎与在一般的捕获包,扩展困难,我们推出我们自己的通用拉姆达产生的闭合类型的版本。 first
:
struct __closure_first {
template <typename... Args>
auto operator()(Args&&... one) const
{
auto second = [&] (auto&&... two) {
return ((one * two) + ...);
};
return second(one...);
}
};
显然,这不是一个真正的闭包类型,非闭包本地类不能有成员函数模板。 把它放在全球范围内, GCC仍然有效 ,但Clang仍然失败 。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.