考慮下面的代碼片斷:擴展參數包入λ與倍的表達 - 的gcc VS鐺
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,出現以下錯誤:
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)(); }), ...);
~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
卸下post
調用和拉姆達makes g++ compile the fold expression。
這是lambdas之間的相互作用,摺疊表達式和模板函數調用不知何故被標準禁止,或者這是一個海灣合作委員會的錯誤?
海灣合作委員會有[長期問題](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47226)與包擴展一個完整的lambda。不完全是新的。 –
我會帶着門#3,蒙蒂:尚未完全實施。 –