【问题标题】:"Uninitialized captured reference" error when using lambdas in fold expression - clang vs gcc在折叠表达式中使用 lambda 时出现“未初始化的捕获引用”错误 - clang vs gcc
【发布时间】:2017-04-19 14:44:08
【问题描述】:

考虑以下代码:

template <typename F, typename X0, typename X1, typename... Xs>
auto fold_left(F&& f, X0&& x0, X1&& x1, Xs&&... xs)
{
    auto acc = f(x0, x1);
    return ([&](auto y){ return acc = f(acc, y); }(xs), ...);
}

const std::string a{"a"}, b{"b"}, c{"c"}, d{"d"}, e{"e"};
const auto cat = [](auto x, auto y) { return "(" + x + ", " + y + ")"; };

调用和打印fold_left(cat, a, b, c)时,g++7和clang++5都输出:

((a, b), c)


调用和打印fold_left(cat, a, b, c, d)(超过3个参数)时,clang++5输出:

(((a, b), c), d)

相反,g++7 产生了一个奇怪的编译时错误(缩短)

prog.cc: In instantiation of 'auto fold_left(F&&, X0&&, X1&&, Xs&& ...) [*...*]':
prog.cc:17:43:   required from here
prog.cc:8:13: error: member 'fold_left(F&&, X0&&, X1&&, Xs&& ...) [*...*]
    ::<lambda(auto:1)>::<acc capture>' is uninitialized reference
     return ([&](auto y){ return acc = f(acc, y); }(xs), ...);
             ^
prog.cc:8:13: error: member 'fold_left(F&&, X0&&, X1&&, Xs&& ...) [*...*]
    ::<lambda(auto:1)>::<f capture>' is uninitialized reference

live example on wandbox


我的代码是不是因为某种原因格式错误,还是这是一个 g++7 错误

【问题讨论】:

  • 您是否打算为来自xs 的每个参数创建唯一的 lambda 类型?
  • 您打算问多少个“在 GCC 中打包扩展 lambda”的问题? :)
  • @T.C.尽可能多地让他们听到我们的 lambda 包扩展需求。 :D

标签: c++ language-lawyer c++17 fold-expression


【解决方案1】:

这是gcc bug 47226。 gcc 根本不允许产生这样的 lambda 包扩展。

但是,您没有理由将 lambda 放入包扩展中。甚至完全使用 lambda:

template <typename F, typename Z, typename... Xs>
auto fold_left(F&& f, Z acc, Xs&&... xs)
{
    ((acc = f(acc, xs)), ...);
    return acc;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2022-01-19
    • 2020-09-26
    • 2017-02-27
    • 2020-11-07
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多