非常に厳密なセマンティクスを適用し、いくつかの生涯の懸念に対処するために、オブジェクトを強制的にスタックに配置したいと思います。operator new
これを行う方法に関するいくつかの記事を読み、非公開にする(または削除する)ことに到達しました。これは、をnew
直接使用すると期待どおりに機能するようですが、正常にmake_shared
コンパイルされます。
#include <boost/smart_ptr.hpp>
class A
{
private:
void *operator new( size_t );
void operator delete( void* );
void *operator new[]( size_t );
void operator delete[]( void* );
};
int main()
{
// A* a = new A; // Correctly produces compile error
boost::shared_ptr<A> a2 = boost::make_shared<A>();
}
直接使用new A
すると、予想どおりにこのエラーが発生します。
error: ‘static void* A::operator new(size_t)’ is private
配置の新しい演算子を使用しているため、これは機能していると思いますmake_shared
が、これを禁止する方法について説明している記事は見つかりませんでした。私が思いついた最善の解決策は、テンプレートの特殊化を明示的に削除することですmake_shared
namespace boost
{
template<>
shared_ptr<A> make_shared<A>() = delete;
};
これは明らかに非常に固有boost::make_shared
です。これは本当に最良の方法ですか?