5

次の C++11 コードがあります。

template<typename... T>
int g(T... t)
{
    return 0;
}

template<class... Args>
void f(Args... args)
{
    auto lm = [&, args...] { return g(args...); };
    lm();
}

int main()
{
    f(2, 5, 7);
}

によると、それは有効なC++ 11であると私は信じています。標準のセクション 5.1.2.23。

省略記号が続くキャプチャは、パック展開 (14.5.3) です。[ 例:

template<class... Args> void f(Args... args) {
    auto lm = [&, args...] { return g(args...); }; lm();
}

— 終了例 ]

ただし、Clang++ は正常にコンパイルされますが、G++ ではこのエラーが発生します。

main.cpp: In function 'void f(Args ...)':
main.cpp:10:23: error: expected ',' before '...' token
     auto lm = [&, args...] { return g(args...); };
                   ^
main.cpp:10:23: error: expected identifier before '...' token
main.cpp:10:26: error: parameter packs not expanded with '...':
     auto lm = [&, args...] { return g(args...); };
                      ^
main.cpp:10:26: note:         'args'
main.cpp: In lambda function:
main.cpp:10:43: error: expansion pattern 'args' contains no argument packs
     auto lm = [&, args...] { return g(args...); };
                                       ^
main.cpp: In instantiation of 'struct f(Args ...) [with Args = {int, int, int}]::__lambda0':
main.cpp:10:49:   required from 'void f(Args ...) [with Args = {int, int, int}]'
main.cpp:16:14:   required from here
main.cpp:10:19: error: using invalid field 'f(Args ...)::__lambda0::__args'
     auto lm = [&, args...] { return g(args...); };
                   ^

だから私の質問は簡単です、これは G++ のコンパイラのバグですか?

4

1 に答える 1

3

GCC ではサポートが実装されていないようです。逆に、パック展開内にラムダを含めることはできません (パック引数ごとに 1 つのラムダを生成するため)。この 2 つの機能はまったく連携していないようです。

単に[&]代わりに使用する場合は、より役立つエラー メッセージがあります。

未実装: テンプレートでの「type_pack_expansion」の使用

免責事項: 私の GCC のコピーは 7 月下旬にビルドされました。おそらくアップグレードの予定です。

于 2013-09-18T11:45:28.097 に答える