C++ 向泛型lambda传递参数时复制构造函数不正确

C++ 向泛型lambda传递参数时复制构造函数不正确,c++,gcc,c++17,auto,generic-lambda,C++,Gcc,C++17,Auto,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; Ident

考虑这段代码:

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;
}
template
constexpr auto-Identity=[](auto&&…{返回什么;};
结构禁令
{
Ban()=默认值;
Ban(const Ban&Ban)=删除;
禁令(禁令和禁令)=删除;
};
int main()
{ 
禁令;
身份(10,禁止);
返回0;
}
它无法使用
gcc-7.3
编译,因为它试图复制
Identity
的第二个参数。为什么会这样?这是
gcc
中的错误吗


gcc
不会抱怨第二个参数是临时参数或只有一个参数。当
标识的定义为
(…)
而不是
(auto&&…
时,它只抱怨一个参数。前半部分是对旧GCC版本中通用lambda的
auto&&…
的错误解析:


预计下半年将出现。传递C-style
variadics生成一个副本,您删除了副本构造函数。

可能确实是一个bug,gcc-8和clang很高兴地编译了它。令人惊讶的是,
gcc-8
在将
(自动和…
更改为
(…)
时失败!作为一项建议,包括简易修复:
[](auto&&…x)
为未使用的包命名。