一位同事坚持将Meyer的Singleton用于所有全局指针变量,因为“不能保证全局unique_ptr
的构造不会抛出”。所以而不是:
#include <memory>
std::unique_ptr<Foo> ptr(nullptr); // Apparently this isn't safe.
int main(/*blah*/)
{
ptr.reset(new Foo());
}
我们现在有
unique_ptr<Foo> singleton
{
try
{
static unique_ptr<Foo> ptr();
return ptr;
}
catch (...)
{
std::cerr << "Failed to create single instance\n";
exit(1);
}
return unique_ptr<Type>();
}
int main()
{
}
对我而言,这似乎是寻找问题的解决方案。他有意见吗?
答案 0 :(得分:21)
您的同事不正确(或者可能只是过时,unique_ptr
的预标准版本可能会有所不同)。 nullptr_t
的{{1}}构造函数保证不会抛出(20.7.1.2):
unique_ptr
因为它也是constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}
(并且因为constexpr
是一个常量表达式),所以需要在常量初始化期间初始化它(3.6.2 / 2)。所以控制初始化顺序(Meyers单例可能有用的另一个原因)也不适用于此。
答案 1 :(得分:2)
“无法保证全局unique_ptr的构造不会抛出”
如果它抛出,会发生什么?应用程序终止,尽管如果你没有捕获异常,标准没有指定堆栈是否被解除(作为全局变量,没有地方可以捕获异常)。我不清楚所提议的解决方案是如何明显改进的。