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)
为未使用的包命名。