Неправильный конструктор копирования при передаче аргумента в общую лямбду - PullRequest
0 голосов
/ 27 сентября 2018

Рассмотрим этот фрагмент кода:

template < auto What >
constexpr auto Identity = [](auto&&...) { return What; };

struct Ban
{
  Ban() = default;
  Ban(const Ban&  ban) = delete;
  Ban(      Ban&& ban) = delete;
};

int main()
{ 
  Ban ban;
  Identity<false>(10,ban);

  return 0;
}

Не удается скомпилировать на godbolt.org с gcc-7.3, поскольку он пытается скопировать второй аргумент Identity.Почему это должно?Это ошибка в gcc?

gcc не жалуется, если второй аргумент является временным или когда есть только один аргумент.Он жалуется только на один аргумент, когда определение Identity имеет (...) вместо (auto&&...).

1 Ответ

0 голосов
/ 27 сентября 2018

Первая половина - это неправильный синтаксический анализ auto&&... для универсальных лямбд в более старых версиях GCC: clang vs gcc - пустой универсальный пакет аргументов лямбда-вариационных аргументов ; Должен ли не захватывать общие лямбды распадаться на указатели функций? ; Должно ли не захватывать общие лямбды распадаться на указатели функций?

Ожидается вторая половина.Передавая в стиле C ... variadics делает копию, и вы удалили свой конструктор копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...