将参数传递给通用 lambda 时复制构造函数不正确

Incorrect copy constructor while passing argument to generic lambda

考虑这段代码:

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&&...).

时,它只抱怨一个参数

前半部分是对旧 GCC 版本中通用 lambda 的 auto&&... 的错误解析:; ;

预计下半场。传递 C 风格 ... 可变参数创建一个副本,你删除了你的复制构造函数。