繁体   English   中英

clang vs gcc:变量lambda捕获

[英]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。

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

已在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM