c++ - 在 C++ 11 中将 `nullptr` 作为 `std::shared_ptr` 返回是否安全?

标签 c++ c++11 shared-ptr smart-pointers implicit-conversion

以以下代码片段作为起始示例:

template <typename FOO>
std::shared_ptr<FOO> createSharedPtr(bool yesNo) {
  if (!yesNo) {
    return nullptr;
  } else {
    return make_shared<FOO>();
  }
}

我以为return nullptr;上面的语句符合 C++ 11 标准,如 nullptr将用于构造 null std::shared_ptr返回调用者时,如 cppreference shared_ptr 中所述:

constexpr shared_ptr( std::nullptr_t ) noexcept;            (2)

但是,我的一位同事一直坚持认为他应该选择 return shared_ptr<FOO>();相反,因为他找不到任何分配 nullptr 的官方文件或示例到 std::shared_ptr .

我的理解正确吗?如果是,我应该向他出示什么文件来证明我的意见?

更新1

我实际上确实与他进行了讨论,引用了 cppreference shared_ptr ,看来他现在关心的是:

That means that using shared_ptr() or shared_ptr(nullptr). But returning nullptr needs to do casting from nullptr to shared_ptr and it needs a copy constructor.

如果我理解正确的话,他关心的是nullptr如何被构造成 shared_ptr 。对此,关键点在于nullptr的隐式转换。至shared_ptr 。这应该相当于:

class A {
 public:
  A(int a) : a_(a) {}

 private:
  int a_;
};

A a = 1;

我应该查看哪个文档来澄清上述代码的正确性?

更新2

看起来像Converting constructor可以解释一下这里的重点。谢谢大家!

最佳答案

它们的意思是一样的。在这里您甚至可以看到生成的汇编代码是相同的: https://godbolt.org/z/odKc4q9ja

如果您喜欢简洁和/或不喜欢 nullptr,您可以返回 {} 以获得相同的效果。

关于c++ - 在 C++ 11 中将 `nullptr` 作为 `std::shared_ptr` 返回是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68451967/

相关文章:

c++ - 使用 QQueue::enqueue() 时出现段错误

java - int[] 在 Java 和 C++ 之间共享?

c++ - 如何创建 shared_ptr 的容器到抽象类

c++ - 对具有不可复制值的 STL 容器使用 boost 序列化时出现编译错误

c++ - 通过引用而不是通过值从函数中获取对象

c++ - 在派生类的对象创建期间使用 shared_from_this() 的两阶段构造

c++ - 如何从命令提示符将字符 `^` 传递给我的程序?

c++ - 在 emacs 中寻求自动完成功能

c++ - 我可以确保 RVO 用于重新解释的值吗?

c++ - G++ 新的 ABI 问题