调用值构造函数而不是复制构造函数

Value Constructor instead of Copy Constructor gets called

本文关键字:构造函数 复制 调用      更新时间:2023-10-16
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);