首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clang vs gcc:各种lambda捕获

clang vs gcc:各种lambda捕获
EN

Stack Overflow用户
提问于 2019-05-29 16:56:49
回答 1查看 322关注 0票数 11

我正在尝试捕获内部lambda中的可变lambda参数,并在那里使用它。作为示例,请考虑以下代码:

代码语言:javascript
复制
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似乎已经修复了。

EN

回答 1

Stack Overflow用户

发布于 2019-06-02 19:29:31

这是Clang中的一个bug。这就是reported。每个comment

已在r362358中修复

(附注: Clang似乎很难在捕获中进行包扩展。让我们推出为通用lambda first生成的闭包类型的我们自己的版本

代码语言:javascript
复制
struct __closure_first {
    template <typename... Args>
    auto operator()(Args&&... one) const
    {
        auto second = [&] (auto&&... two) {
            return ((one * two) + ...);
        };
        return second(one...);
    }
};

显然,这不是真正的闭包类型,非闭包局部类不能有成员函数模板。将其放在全局作用域GCC still worksClang still fails中。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56356708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档