模板操作符赋值重载未被调用

templated operator assignment overload not getting called

本文关键字:调用 重载 赋值 操作符      更新时间:2023-10-16

我有一个模板类,如下所示:我重载了赋值操作符。将一个变量赋值给另一个变量时,永远不会调用重载赋值操作符。看起来编译器正在生成一个默认的赋值操作符并调用它。有什么原因吗?

#include<iostream>
using namespace std;
template<typename T>
class X
{
public:
  X()
  {
    cout<<"X()"<<endl;
  }
  X& operator=( X&)
  {
    cout<<"X=()"<<endl;
  }
};
int main()
{
  X<int> a;
  X<int> b = a;
}
输出:

X()
预期输出:

X()
X=()

X<int> b = a;是初始化,不是赋值,所以调用复制构造函数

这个语法叫做copy initialization。与X<int> b(a)相似

获取赋值:

X<int> b;
b = a;

还要注意,正确的赋值操作符应该是这样的:

X& operator=(const X&)
{
   //...
   return this;
}