我正在尝试捕获内部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中的一个bug。
同样有趣的是:将返回语句更改为直接展开one的语句(在与two组合之前),这将再次编译:return (((one * ...) * two) + ...);
我已经找到了与this相关的帖子,但是clang8中声明的bug似乎已经修复了。
发布于 2019-06-02 19:29:31
这是Clang中的一个bug。这就是reported。每个comment
已在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...);
}
};显然,这不是真正的闭包类型,非闭包局部类不能有成员函数模板。将其放在全局作用域GCC still works和Clang still fails中。)
https://stackoverflow.com/questions/56356708
复制相似问题