我正在阅读一本关于模板编程的书,其中一个示例具有在模板赋值运算符中进行自检的代码。基本上它是这样的:
template <typename T>
class Foo
{
public:
template <typename O>
Foo<T> operator= (const Foo<O> & other)
{
if ((void *)this == (void *)&other)
{
std::cerr << "success" << std::endl;
}
else
{
std::cerr << "failure" << std::endl;
}
return *this
}
};
现在,据我了解,由于模板化赋值运算符不会阻止生成默认赋值运算符,因此对于 O = T 的情况,将始终选择默认赋值运算符而不是模板化版本。也就是说,在这种情况下,永远不会出现 O = T。
我想知道的是我对此的理解是否正确。如果是,是否存在某种棘手的层次结构(例如,如果我从其他东西派生 Foo 或者如果它是从其他东西派生的)赋值运算符将打印出“成功”?
我已经尝试了几件事,但我真的无法做到这一点。
提前致谢