最近我一直在研究 Meyers 的 Effective C++ 第三版。对于我目前正在从事的项目,我必须创建一个我明确希望禁止使用编译器生成的函数的类。我使用上述书中的第 6 项作为参考实现了代码,唯一的主要区别在于我的类是模板化的。它的代码如下
template <class T>
class Uncopyable
{
protected:
Uncopyable<T>(){}
virtual ~Uncopyable<T>(){}
private:
Uncopyable<T>(const Uncopyable<T>&);
Uncopyable<T>& operator=(const Uncopyable<T>&);
};
我的测试功能。
class Test : private Uncopyable<Test>
{
public:
Test(){}
~Test(){}
inline void test()
{
std::cout << "blah" << std::endl;
}
private:
protected:
};
当这样使用时,代码完全按预期工作
int main(int argc, char* argv[])
{
Test t1, t2;
// Works as expected, doesnt allow copying of object
t2 = t1;
// and this works fine, no copying
Test t3 = t2;
// finally, works correctly no copying is allowed
Test t4(t1);
return 0;
}
然而,当像这样使用时,代码编译得很好并且可以进行复制,但它不应该能够吗?
int main(int argc, char* argv[])
{
Test* t1 = new Test(), *t2;
t1->test();
// Works when it shouldnt work?
t2 = t1;
t2->test();
// same with this
Test* t3 = t2;
t3->test();
// and this
Test* t4(t1);
t4->test();
delete t1;
return 0;
}
我在没有模板类的情况下尝试过,结果是一样的,所以我认为这不是问题。
那么,为什么允许这种情况发生?我的代码中是否有错误,或者我只是理解错误的概念?谢谢。