以以下代码片段作为起始示例:
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/