将参数传递给通用 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 风格 ...
可变参数创建一个副本,你删除了你的复制构造函数。
考虑这段代码:
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 风格 ...
可变参数创建一个副本,你删除了你的复制构造函数。