c++ - 如何防止客户端将 nullptr 传递给构造函数?

标签 c++ c++11 constructor unique-ptr

对于需要 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();
}

最佳答案

我会结合这两种方法:

class Foo{
public:
    Foo(std::unique_ptr<Bar> bar) :
        myBar(std::move(bar))
    {
        if(!myBar)  // check myBar, not bar
            throw invalid_argument();
    }
    Foo(nullptr_t) = delete;
}

删除的构造函数将阻止某人做 Foo{nullptr}但它不会阻止 Foo{std::unique_ptr<Bar>{}} ,因此您还需要在构造函数主体内进行检查。

但是,您无法检查参数 barmove 之后检查它,该支票将 always fail .检查您移动了 myBar 的数据成员 ( unique_ptr)进入。

关于c++ - 如何防止客户端将 nullptr 传递给构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091876/

相关文章:

c++ - C++ 构造函数的默认参数

c++ - 指向模板类作为该类参数的指针

c++ - 在 switch 中使用类类型

c++ - 从订购的容器中制作比较器

C++ 对象实例化数组(我试图找到一个编译时解决方案)

c++ - 类构造函数不起作用?

c++ - 为什么返回时调用的是拷贝构造函数而不是 move 构造函数?

c++ - 读取较大文件时出现未处理的异常

数组中的 C++ 段错误用户输入

c# - 在不存在的结构布局中循环