私はこのようなコードを防ぎたい:
unique_ptr<ClassA> captr = unique_ptr<ClassA>(new ClassA());
....
shared_ptr<Base> sptr = move(captr);
このコードはコンパイラエラーを生成するはずですが、代わりにコンパイルして、実行時にダブルフリーやその他の奇妙なエラーを生成します。shared_ptrにunique_ptrを割り当てることは、まったく意味がありません。何かがunique_ptrと宣言されている場合、それは共有されることを意図していません。ただし、shared_ptrへのunique_ptrの割り当てが許可されている場合、この制限はなくなります。
そして残念ながら、一部の関数がunique_ptrを返し、一部の関数がshared_ptrを引数として取る場合、非常に簡単に犯される間違いです。
質問は、テンプレート化されている特定のクラスに関係なく、unique_ptrとshared_ptrのすべてのテンプレート化されたバリエーションに対してこれらの割り当てを禁止するにはどうすればよいですか?
代入演算子を削除済みとして宣言するようなことを考えていますが、そのような宣言がどのようになるかはわかりません。