我正在阅读一本关于模板编程的书,其中一个例子是他们的代码在模板化赋值运算符中进行自检。基本上它类似于以下内容:
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或者是否从其他东西派生出来),其中赋值运算符将打印出“成功”?
我尝试过几件事,但我真的无法做到这一点。
提前致谢
答案 0 :(得分:0)
要么你是对的,要么MSVC 11和g ++ 4.7.1都错了。
即,通常不会调用模板化赋值运算符:将调用自动生成的复制赋值运算符。
要输出“success”,请执行此操作,并希望编译器使用Empty Base class Optimization(EBO):
#include <iostream>
template <typename T>
class Foo;
template<> class Foo<void> {};
template <typename T>
class Foo: public Foo< void >
{
public:
template <typename O>
void operator=( const Foo<O> & other )
{
if ((void *)this == (void *)&other)
{
std::cerr << "success" << std::endl;
}
else
{
std::cerr << "failure" << std::endl;
}
}
};
int main()
{
Foo<int> a, b;
Foo<void>& v = a;
a = v;
}