11

我正在尝试在内部 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) + ...);

我找到了这个相关的帖子,但是那里声明的错误似乎已在 clang8 中修复。

4

1 回答 1

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

显然,这不是真正的闭包类型,非闭包本地类不能有成员函数模板。把它放在全局范围内,GCC 仍然有效Clang 仍然失败。)

于 2019-06-02T11:29:31.493 回答