模板化的运算符赋值超载未被调用

时间:2014-05-28 16:06:49

标签: c++ templates

我有一个类似下面的模板类。我重载了赋值运算符。当我将一个变量分配给另一个变量时,永远不会调用重载的赋值运算符。看起来编译器正在生成一个默认赋值运算符并调用它。有什么理由吗?

#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=()

1 个答案:

答案 0 :(得分:3)

X<int> b = a;是初始化,而不是赋值,因此调用了复制构造函数。

此语法称为复制初始化。它与X<int> b(a)类似。

获得作业:

X<int> b;
b = a;

另请注意,正确的赋值运算符如下所示:

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