调用值构造函数而不是复制构造函数
Value Constructor instead of Copy Constructor gets called
template<typename T>
class Numeric
{
public:
Numeric() : val(T()) { cout << "ctor defaultn"; }
explicit Numeric(const T& v) : val(v) { cout << "ctor valuen"; }
Numeric(const Numeric& v) : val(v.val) { cout << "copy ctorn"; }
Numeric(Numeric&& v) { val = v.val; cout << "cmoven"; v.val = 0; }
Numeric& operator=(const Numeric& v) { val = v.val; cout << "copy assignmentn"; return *this; }
Numeric& operator=(Numeric&& v) { val = v.val;cout << "amoven"; return *this; }
~Numeric() { cout << "dtorn"; };
private:
T val;
};
// ----------- main ------
Numeric<int> c1(Numeric<int>(2)); // calls the normal constructor instead of copy constructor
我希望调用复制构造函数,但事实并非如此,而是调用值初始化的构造函数。
这是怎么回事?似乎有一个内在的转换正在进行,但我不明白为什么。
如果我显式转换它,就像这样
Numeric<int> c1(Numeric<int>(Numeric<int>(2)));
移动构造函数和析构函数被调用。
啊哈,你偶然发现了复制省略。有关更多详细信息,请参阅 https://en.cppreference.com/w/cpp/language/copy_elision。该页面上的第一个示例是您描述的确切情况。
您可以通过将主节点更改为
Numeric<int> c0(2);
Numeric<int> c1(c0);
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类