clang vs gcc:可变参数lambda捕获

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中已修复。

L. *_* F. 1

这是 Clang 中的一个错误。据报道。每条评论

在 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 仍然失败。)