我在这些问题上提到了很多StackOverflow链接,其中auto_ptr不能与STL一起正常工作的原因是
std::auto_ptr<>不满足可复制构造和可分配的要求(因为auto_ptr具有伪造的复制构造函数,它基本上转移了所有权)。

但是即使unique_ptr也没有复制ctor和赋值运算符(已禁用),那么如何满足可复制构造和可赋值的要求?

最佳答案

您正在反向看整个事情。

在C ++ 98/03中,我们得到了auto_ptr。这种类型对每个人来说都是假装它支持复制语义,而实际上复制它所做的事情与复制操作非常不同。因此,任何依赖于提供复制语义的类型的类型(例如某些容器)都不会很好地获得auto_ptr。当然,您只会发现代码何时失灵,而不会发现编译时。

在C ++ 11中,我们得到了unique_ptr,该类型明确不提供复制语义。而是提供了移动语义,并正确提供了它们。因此,在给定unique_ptr时,任何依赖提供复制语义的类型的类型都将无法编译。

但是,之所以成为unique_ptr之所以,是因为在C ++ 11中,将对象移动的概念添加到了该语言中。当将新概念添加到该语言时,通常会相对于该语言功能重新评估现有工具(例如标准库要求)。

例如,以前需要复制语义的类型不一定必须保持该要求。需要复制语义的C ++ 98/03容器在C ++ 11中进行了更新,仅要求(无例外)从类型中移动语义。

因此,并不是unique_ptr满足了auto_ptr没有满足的某些要求。是因为语言已更改为不再需要该要求,但auto_ptr仍然在要求其所做的事情,因此出于向后兼容的考虑,我们创建了一种尊重新语言功能并且不向人们说谎的新类型。

09-07 10:39