我可以将 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;
}
但是,没有来自int
或来自int*
的赋值运算符,也没有来自int
或int*
的隐式构造函数。有一个来自int*
的构造函数,但那个构造函数是显式的。我检查了标准库实现,构造函数确实是显式的,并且看不到可疑的赋值运算符。
该程序实际上是格式良好还是 GCC 在搞砸我?
这起作用的原因是标准的简短引用:
§4.10 [conv.ptr] p1
空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为 0 或
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);
}
活生生的例子。
只能将共享指针分配给共享指针的另一个实例。无法分配shared_pointer包含的类型。Afaik 这是操作员唯一的过载:
shared_ptr& operator=(const shared_ptr& r);
您正在做的是将 0(在本例中等于 NULL)分配给指针,而不是类型的值。此时,您的键入甚至没有在代码中初始化。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 为什么 ( ( cout << ptr; cout << "n" << ++ptr; )) 和 ( ( cout << ptr << "
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么(常量字符*)ptr 不被视为左值
- 由于 RPTR->num=30 与 (*rptr).num=30 相同,但是*((*rptr).ptr).name 不起作用为什么?
- 带智能ptr的Pimpl-为什么需要构造函数/析构函数
- 为什么Mozilla开发者指南更喜欢if(ptr)而不是if(ptr!=nsnull)
- 为什么asm中的这种差异对性能很重要(在未优化的ptr++与++ptr循环中)
- 为什么非常量ptr不能隐式地将ptr转换为常量作为模板中的参数
- 为什么我会在不存储 ptr 的情况下调用新
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么这个显式析构函数会导致共享ptr中的内存损坏
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 为什么int** ptr在访问ptr[i][j]时不指向与int arr[3][3]相同的地址?
- 为什么不使用空自动PTR不会终止程序?
- 为什么 *ptr++ 不更改 pointee 的值,但 (*ptr)++ 会更改?