试图返回用`NULL`构造的`std :: unique_ptr`

时间:2015-08-25 12:53:45

标签: c++ c++11

我正在设计一个工厂,它创建不同类型的Foo,我正在尝试使用智能指针。

大多数似乎运行良好,但由于编译器的限制,我遗漏了一些重要的功能(即nullptr)。

我有这个方法:

std::unique_ptr<Foo> createFoo(const std::string &fooType) {
    auto it = _registeredFoo.find(fooType); // _registeredFoo is a map
    if(it != _registeredFoo.end())
       return std::unique_ptr<Foo>(it->second());
    return std::unique_ptr<Foo>(NULL);
}

当我测试这个方法时,它永远不会返回类似指针的NULL

这是我测试方法的方法。

std::unique_ptr<Foo> _foo = FooFactory::getInstance()->createFoo("FOO"); //FOO is registered
if(_foo) {
  std::cout << "Hello, World!" << std::endl;
} else {
  std::cout << "Goodbye, World!" << std::endl;
}

std::unique_ptr<Foo> _bar = FooFactory::getInstance()->createFoo("BAR"); // BAR is unregisered
if(_bar) {
  std::cout << "Hello, World!" << std::endl;
} else {
  std::cout << "Goodbye, World!" << std::endl;
}

我总是看到“你好,世界!”

这让我相信我对std::unique_ptr的构造函数的使用有点滥用。任何人都可以在没有emulating nullptr myself的情况下向我推荐如何解决这个问题吗?

我正在使用gcc 4.4.6。

3 个答案:

答案 0 :(得分:6)

我认为你想要的是一个空的unique_ptr

return std::unique_ptr<Foo>();

您似乎正在寻找一个指向无对象的指针(转换为false时为bool)。

答案 1 :(得分:6)

您可以使用std::unique_ptr的默认constructor

std::unique_ptr<int> a1();
std::unique_ptr<int> a2(nullptr);

a1a2是初始化为空的唯一指针(没有任何东西)。

您可以使用unique_ptr类提供的operator bool来验证指针的空白:

if (!a1) { // the smart pointer is empty
}

答案 2 :(得分:5)

你想要的是

return {};

{}返回任何(类)类型 1 的默认构造对象,并且可以读作“nothing”。它适用于智能指针,可选,以及大多数内容。

如果您的编译器缺少此

return std::unique_ptr<Foo>();

会做到的。无论如何,将NULL传递给std::unique_ptr在C ++ 11中是不合法的(the constructor is ambiguous)

您没有C ++ 11编译器。在代码中使用C ++ 11会容易出错。

1 正确的措辞是complicated。对于标量(如int),这会对值进行零初始化(实际上,将值设置为0 / null / 0.0 / '\0'等)。