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

R. *_*des 12 c++ null c++11

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

#include <memory>

int main() {
    std::shared_ptr<int> p;
    p = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Xeo*_*Xeo 16

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

§4.10 [conv.ptr] p1

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

而且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);
}
Run Code Online (Sandbox Code Playgroud)

实例.

  • 关于像42 - 42这样的奇怪的空指针常量,那可能会消失,[只有一个文字0将是一个有效的空指针常量](http://www.open-std.org/jtc1/sc22/wg21/docs /cwg_active.html#903),在C++的未来版本中. (7认同)