繁体   English   中英

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

[英]Can I assign 0 to a shared_ptr? Why?

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

#include <memory>

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

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

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

这有效的原因是标准的这个简短引用:

§4.10 [conv.ptr] p1

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

事实上std::shared_ptr有一个来自std::nullptr_t的隐式构造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)分配给指针,而不是类型的值。 您在此代码中甚至未对类型进行初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM