最近、私はMeyersのEffective C ++ThirdEditionを使用しています。現在取り組んでいるプロジェクトでは、コンパイラで生成された関数の使用を明示的に禁止したいクラスを作成する必要がありました。この本の項目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;
}
テンプレートクラスなしで試してみましたが、結果は同じなので、それは問題ではないと思います。
それで、なぜこれが起こるのを許されるのですか?コードにエラーがありますか、それとも概念が間違っているだけですか?ありがとう。