Biorąc pod uwagę kod poniższym przykładzie:Rozszerzanie parametru pakiet do lambda ze składaną ekspresji - GCC vs brzękiem
template <typename TF>
void post(TF){ }
template <typename... TFs>
struct funcs : TFs...
{
funcs(TFs... fs) : TFs{fs}... { }
void call()
{
(post([&]{ static_cast<TFs&>(*this)(); }), ...);
}
};
clang++ 3.8+ successfully compiles the code.
g++ 7.0 fails to compile z powodu następującego błędu:
prog.cc: In lambda function:
prog.cc:10:43: error: parameter packs not expanded with '...':
(post([&]{ static_cast<TFs&>(*this)(); }), ...);
~~~~~~~~~~~~~~~~~~~~~~~~^~
prog.cc:10:43: note: 'TFs'
prog.cc: In member function 'void funcs<TFs>::call()':
prog.cc:10:13: error: operand of fold expression has no unexpanded parameter packs
(post([&]{ static_cast<TFs&>(*this)(); }), ...);
~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demontaż połączenia post
i lambda makes g++ compile the fold expression.
Czy ta interakcja między lambdami, wyrażeniami zagięcia i wywołaniami funkcji szablonów jest w jakiś sposób zabroniona przez standard, czy jest to błąd gcc?
GCC ma [długotrwałe problemy] (https://gc.gnu.org/bugzilla/show_bug.cgi?id=47226) z pakietem rozszerzającym całą lambdę. Niezupełnie nowy. –
Ja wezmę drzwi # 3, Monty: jeszcze nie w pełni zaimplementowane. –