【问题标题】:Can I assign 0 to a shared_ptr? Why?我可以将 0 分配给 shared_ptr 吗?为什么?
【发布时间】:2012-08-09 17:14:45
【问题描述】:

我意识到在 GCC 4.7 中可以正常编译:

#include <memory>

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

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

程序实际上是格式正确的还是 GCC 搞砸了我?

【问题讨论】:

  • 0 是特殊文字,它转换为nullptr_t
  • @LucDanton 这是因为 g++ 非常聪明,可以将42 - 42 转换为0。同样的事情发生(发生了?)在 Clang,IIRC,它在 GN2012 中被提及
  • @Abyx 你没抓住重点——0 在语言中没有作为文字的特殊处理。

标签: c++ null c++11


【解决方案1】:

之所以有效,是因为这个标准的简短引用:

§4.10 [conv.ptr] p1

空指针常量是一个整数常量表达式 (5.19) 整数类型的纯右值计算为零std::nullptr_t 类型的纯右值。 [...] 整数类型的空指针常量可以转换为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);
}

Live example.

【讨论】:

【解决方案2】:

您只能将共享指针分配给共享指针的另一个实例。无法分配 shared_pointer 持有的类型。 Afaik 这是运算符的唯一重载:

shared_ptr&amp; operator=(const shared_ptr&amp; r);

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

【讨论】:

  • 这并没有真正解决这个问题:“为什么编译器会毫无怨言地接受这个”
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 2019-01-25
  • 2019-07-04
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多