通过一个期望
std::unique_ptr
的构造函数,如何有效地防止客户端传递 nullptr
?class Foo{
Foo(std::unique_ptr<Bar> bar) :
myBar(std::move(bar))
{}
}
我能否使用nullptr_t
参数重载构造函数,然后将其设置为已删除状态,在编译时检测一些nullptr
?
Foo(nullptr_t) = delete;
当我已经在初始值列表中移动了nullptr
时,我能否在构造函数体中安全地检查它?(有些东西告诉我我不能)
Foo(std::unique_ptr<Bar>) :
myBar(std::move(bar))
{
if(!bar)
throw invalid_argument();
}
Foo(nullptr_t) = deleted;
- 是的。但请记住,这只停止了nullptr
,而不是空指针。 - chrisFoo{nullptr}
,但不会捕获Foo{std::unique_ptr<Bar>{}}
。 - ascheplerunique_ptr<Bar>
的包装类,它不允许出现空的unique_ptr
的可能性。 - Benjamin LindleyFoo
类进行的操作,为了满足我的特殊需求,我将unique_ptr
进行了封装。通过值传递对象的问题在于我的Bar
非常大。编辑:我的Foo
构造函数应该只是模拟Bar
构造函数或者像make_unique
一样充当转发器。 - iFreilicht