模板化副本分配运算符

时间:2019-11-02 05:58:55

标签: c++ templates

根据cppreference,副本分配运算符应不使用模板:

  

类T的副本分配运算符是名称为operator =的非模板非静态成员函数,该函数正好采用类型T,T&,const T&,volatile T&或const volatile T&“

但是在这个示例程序中,我编写了一个模板化赋值运算符,没有编译问题,并且实际上被调用(并且不是默认隐式生成的)。

template<typename T1>
class Sample
{
public:
        T1 a;
        Sample(T1 b)
        {
                a=b;
        }

        template<typename T2>
        void operator  = (T2& obj2)
        {
                cout<<"This wont be called";
                (*this).a=obj2.a;
        }

};


        Sample<int> obj1(2);
        Sample<int> obj2(3);

        obj2=obj1;

输出:

This wont be called

我误会了吗?

2 个答案:

答案 0 :(得分:1)

template<typename T2>
    void operator=(T2& obj2) { ... }

定义了operator=函数,但根据标准,它不是复制分配运算符。要成为副本分配操作员,必须具备以下条件:

void operator=(Samble& obj2) { ... }

或更佳

Sample& operator=(Sample const& obj2) { ... }

给出您的代码,您可以使用:

Sample<int> a;
Samble<double> b;
b = a;

如果您拥有真正的副本分配运算符,则它将无法编译。

答案 1 :(得分:1)

template<typename T2> void operator = (T2&)不是复制分配运算符。

因此会生成默认的void operator = (const Sample&)

但您更适合:

Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;

但是

const Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;

您将获得预期的结果:

Demo