考虑下面的自给程序。
#include <iostream>
template<typename Ty>
struct Foo
{
Foo& operator=(Foo foo){ return foo; }
private:
Foo& operator=(Foo& foo){ return foo; }
};
template<typename Ty>
struct Bar
{
template<typename U>
Bar& operator=(Bar<U> bar){ return bar; }
private:
Bar& operator=(Bar& bar){ return bar; }
};
int main()
{
Foo<int> f1, f2;
f1 = f2; // (1)
Bar<int> b1, b2;
b1 = b2; // (2)
f1 = Foo<int>(f2); // (3)
b1 = Bar<int>(b2); // (4)
}
Foo
和Bar
都重载赋值操作符,在使用这两个操作符时,都无法编译,除非我们显式地将其转换为对象的类型。另外,来自Foo
和Bar
的分配都失败了,但是失败是不同的。注意,当基于引用和值重载函数时,我理解为什么调用是不明确的。但我不明白的是
Note是一个依佩恩版本,以防您想要使用代码。备注请提供适当的参考资料。
发布于 2014-09-09 20:14:41
Foo::operator=
的这两个重载都是同样好的匹配--因此模糊不清。对于Bar::operator=
来说,情况并非如此--其他条件相同,重载解决方案更倾向于非模板而不是模板。因此,私有operator=
是一个更好的匹配-但当然,它会失败访问检查。Foo<int>(f2)
是临时的,不能绑定到非const引用.根据值获取其参数的重载是唯一可行的选择。https://stackoverflow.com/questions/25752780
复制相似问题