簡體   English   中英

在fold表達式中使用lambdas時出現“未初始化的捕獲引用”錯誤 - clang vs gcc

[英]“Uninitialized captured reference” error when using lambdas in fold expression - clang vs gcc

請考慮以下代碼:

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

wandbox上的實例


我的代碼是否由於某種原因而格式不正確,或者這是一個g ++ 7錯誤

這是gcc bug 47226 gcc根本不允許生成像這樣的lambdas包擴展。

但是,沒有理由將lambda放入包擴展中。 甚至可以使用lambda:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM