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

时间:2012-08-09 17:14:46

标签: c++ null c++11

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

#include <memory>

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

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

该计划实际上是否格式正确或海湾合作委员会与我搞混?

2 个答案:

答案 0 :(得分:16)

这样做的原因是标准的简短引用:

§4.10 [conv.ptr] p1

  

空指针常量是整数类型整数常量表达式(5.19)prvalue,其评估为零或类型为std::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);
}

Live example.

答案 1 :(得分:0)

您只能将共享指针指定给共享指针的另一个实例。无法分配shared_pointer保留的类型。 Afaik这是运营商的唯一重载:

shared_ptr& operator=(const shared_ptr& r);

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