我有一个简单的结构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
和d
,
Wrapper<float> c;
const Wrapper<float> d;
c = d;
,并分配给d
c
,既不使用两种赋值操作符重载,并且不显示输出;所以调用默认的复制赋值操作符。为什么将d
分配给c
不使用提供的const重载赋值运算符?或者相反,为什么分配b
到a
而不是使用默认的复制赋值运算符?
+1 for *运算符模板不抑制隐式声明的复制赋值运算符*的生成。 – Nawaz 2011-04-11 18:41:38