如何解决模板副本构造函数会覆盖默认副本构造函数吗?
我希望在下面的示例中使用默认复制构造器的行的存在(或不存在)应该有所不同,但两者的行为(在Windows上)是相同的情况:
template <class T>
struct Vec {
T x = T();
T y = T();
Vec() = default;
Vec(const Vec&) = default; // default copy ctor
template <class Other>
Vec(const Other &o) // templated copy ctor
: x(o.x),y(o.y)
{
cout << "templated copy ctor";
}
};
Vec<int> i;
Vec<double> d = i; // calls templated 'copy ctor'
Vec<double> dd = dd; // does not call templated copy ctor,whether 'default copy ctor' exists,or not !
似乎编译器始终会生成一个默认的构造函数(也就是说,如果我没有显式地delete
或使它protected
生成),因此会生成模板化副本ctor 永不匹配。
如果编译器总是生成默认的构造函数,那为什么我要写这一行? 为什么不总是忽略它呢?
Vec(const Vec&) = default; // default copy ctor
什么是明智的编码标准?
- 始终键入默认的副本ctor,或
- 总是忽略键入默认副本ctor吗?
解决方法
似乎编译器总是生成默认的构造函数(也就是说,如果我不显式删除它或使其受保护),则模板化副本ctor永远不会匹配。
是的:复制构造函数不是模板,因此最适合Vec const &
。
正如某些程序员在评论中观察到的那样,模板(准确地说)不是复制构造函数。
如果编译器总是生成默认的构造函数,为什么我还要编写此行?
不总是如此。
关于删除/默认构造函数和删除/默认赋值运算符的规则很复杂,例如,当存在用户声明的move构造函数或用户声明的move分配时,隐式删除了复制构造函数。
在这种情况下,= default
可以重新启用默认的复制构造函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。