我有一个简单的 struct Wrapper
,以两个模板化的赋值运算符重载为特征:
template<typename T>
struct Wrapper {
Wrapper() {}
template <typename U>
Wrapper &operator=(const Wrapper<U> &rhs) {
cout << "1" << endl;
return *this;
}
template <typename U>
Wrapper &operator=(Wrapper<U> &rhs) {
cout << "2" << endl;
return *this;
}
};
然后我声明a和b:
Wrapper<float> a, b;
a = b;
赋值b
将a
使用上面的非常量模板化赋值运算符重载,并显示数字“2”。
令我困惑的是:如果我声明c
and d
,
Wrapper<float> c;
const Wrapper<float> d;
c = d;
和assign d
to c
,两个赋值运算符重载都不用,也不显示输出;因此调用了默认的复制赋值运算符。为什么分配d
不c
使用提供的 const 重载赋值运算符?或者相反,为什么分配b
不a
使用默认的复制分配运算符?