clang vs gcc:可变参数lambda捕获

时间:2019-05-29 08:56:49

标签: 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);
}

这适用于gcc9,但不适用于clang8(https://godbolt.org/z/i2K9cK)。

一种用于编译代码的方法是显式捕获[&one...],但我想知道这是否是clang中的错误。

同样有趣的是:将return语句更改为直接扩展one的地方(与two组合之前),它将再次编译: return (((one * ...) * two) + ...);

我发现了this个相关的帖子,但声明的错误似乎已在clang8中修复。

1 个答案:

答案 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...);
    }
};

很显然,这不是真正的闭包类型,并且非闭包本地类不能具有成员函数模板。将其放在全局范围commentGCC still works中。)