我可以将 0 分配给shared_ptr吗?为什么

Can I assign 0 to a shared_ptr? Why?

本文关键字:ptr 为什么 shared 分配 我可以      更新时间:2023-10-16

我意识到以下编译在GCC 4.7中很好:

#include <memory>
int main() {
    std::shared_ptr<int> p;
    p = 0;
}

但是,没有来自int或来自int*的赋值运算符,也没有来自intint*的隐式构造函数。有一个来自int*的构造函数,但那个构造函数是显式的。我检查了标准库实现,构造函数确实是显式的,并且看不到可疑的赋值运算符。

该程序实际上是格式良好还是 GCC 在搞砸我?

这起作用的原因是标准的简短引用:

§4.10 [conv.ptr] p1

空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为 0std::nullptr_t 类型的 prvalue 。[...]整型的空指针常量可以转换为 std::nullptr_t 类型的 prvalue。[...]

事实上,std::shared_ptr有一个来自std::nullptr_t的隐式构造函数:

§20.7.2.2 [util.smartptr.shared] p1

constexpr shared_ptr(nullptr_t) : shared_ptr() { }

这也允许像这样的奇怪情况:

#include <memory>
void f(std::shared_ptr<int>){}
int main(){
  f(42 - 42);
}

活生生的例子。

只能将共享指针分配给共享指针的另一个实例。无法分配shared_pointer包含的类型。Afaik 这是操作员唯一的过载:

shared_ptr& operator=(const shared_ptr& r);

您正在做的是将 0(在本例中等于 NULL)分配给指针,而不是类型的值。此时,您的键入甚至没有在代码中初始化。

相关文章: