kaw*_*ken 11 c++ variadic-templates generic-lambda
我试图在内部lambda中捕获一个可变参数的lambda参数,并在其中使用它。例如,考虑以下代码:
int main () {
auto first = [&] (auto&&... one) {
auto second = [&] (auto&&... two) {
return ((one * two) + ...);
};
return second(one...);
};
return first(5);
}
Run Code Online (Sandbox Code Playgroud)
这适用于gcc9,但不适用于clang8(https://godbolt.org/z/i2K9cK)。
使代码编译的一种方法是显式捕获[&one...]
,但是我想知道这是否是clang中的错误。
也很有趣:将return语句更改one
为直接扩展的内容(与结合之前two
),然后再次编译:
return (((one * ...) * two) + ...);
我找到了这个相关的帖子,但是声明在那里的错误似乎在clang8中已修复。
在 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...);
}
};
Run Code Online (Sandbox Code Playgroud)
显然,这不是真正的闭包类型,非闭包局部类不能有成员函数模板。将其放在全局范围内,GCC 仍然有效,而Clang 仍然失败。)
归档时间: |
|
查看次数: |
226 次 |
最近记录: |