我想强制将我的对象放在栈上以实施非常严格的语义并解决一些生存期方面的问题。我已经阅读了一些关于如何做到这一点的文章,得出了将 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
能够工作是因为它使用了放置new运算符,但我找不到任何讨论如何禁止这样做的文章。我想到的最好解决方案是显式删除make_shared
的模板特化。namespace boost
{
template<>
shared_ptr<A> make_shared<A>() = delete;
};
显然,这非常特定于 boost::make_shared
。但这是最好的方法吗?
static
修饰符吗? - Ben Voigt