为什么 std::shared_ptr 没有 [] 运算符
Why is there no [] operator for std::shared_ptr?
我想知道std::shared_ptr
没有定义数组的[]
运算符这一事实背后的理由是什么。特别是为什么std::unique_ptr
具有此运算符而不是std::shared_ptr
?
std::unique_ptr
只定义了数组专用化中的operator[]
:std::unique_ptr<T[]>
。对于非数组指针,运算符 [] 无论如何都没有多大意义(只有 [0]
)。
std::shared_ptr
缺少这样的专业化(在C++11中),这在相关问题中进行了讨论:为什么没有std::shared_ptr<T[]>专业化?
不应将非数组智能指针与数组分配一起使用,除非提供自定义删除程序。特别是,unique_ptr<int> p = new int[10]
是不好的,因为它调用delete
而不是delete[]
。请改用 unique_ptr<int[]>
,这会调用 delete[]
。(这个实现了operator[]
)。如果您使用shared_ptr
来保存T[]
,则需要使用自定义删除器。另请参阅数组shared_ptr:应该使用它吗?-- 但它不提供operator[]
,因为它使用类型擦除来区分数组和非数组(智能指针类型独立于提供的删除器)。
如果你想知道为什么数组没有shared_ptr
专用化:这是一个建议,但没有包含在标准中(主要是因为你可以通过为ptr[i]
编写ptr.get() + i
来解决)。
相关文章:
- 没有运算符"="与这些操作数匹配,JUCE 窗口演示应用程序
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- 没有运算符>>与这些操作数匹配 ifstream
- 没有运算符"=="与这些操作数匹配。操作数类型为:int == type_name'
- 没有运算符>>对应于这些操作数
- 使用堆栈编译错误的 C++ 反向行没有运算符匹配操作数
- 可变长度数组 c++ & 没有运算符>>错误?
- 如何在没有运算符>>的情况下从字符串流返回下一个令牌?
- 没有运算符"<<"匹配这些操作数
- 没有运算符">>"与这些操作数匹配
- 为什么没有运算符< 对于类 std::weak_ptr?
- C++ - 错误 - 没有运算符"[]"与这些操作数匹配
- 错误:没有运算符"<"与这些操作数匹配
- 没有运算符 "+=" 与这些操作数匹配
- 没有运算符匹配这些操作数;操作数类型为: std::istream >> const char [5]
- 为什么 std::list 迭代器没有运算符+
- 使用运算符重载时,没有运算符"<<"匹配这些操作数
- 为什么 std::array 没有运算符 T*?
- 没有运算符"[]"匹配这些操作数/没有模板化代码
- 没有运算符">>"与这些操作数匹配