Ошибка компилятора или нестандартный код? — захват шаблона Variadic в лямбде

У меня есть следующий код 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 ++?

5

Решение

Похоже, что поддержка не была реализована в GCC. И наоборот, вы не можете иметь лямбду внутри расширения пакета (чтобы получить один лямбда на аргумент пакета). Кажется, эти две функции не играют вместе вообще.

Если вы просто используете [&] вместо этого, есть более полезное сообщение об ошибке:

извините, не реализовано: использование type_pack_expansion в шаблоне

Отказ от ответственности: моя копия GCC была создана в конце июля; Я, вероятно, из-за обновления.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]