11

我想要一个 unique_ptr 的向量作为我正在制作的类的成员。

class Foo {
    [...]

private:
    vector<unique_ptr<Bar>> barList;
}

但随后我开始从VS2010编译器收到神秘的错误消息:

error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

连同下面的一些错误行,这些错误行深入到 Microsoft 的实现std::_Copy_impl<>...

我将成员声明更改为

vector<unique_ptr<Bar>>* barList;

它编译。但是我不禁想知道为什么我不能按照我最初想要的方式去做呢?对于笑容,我尝试了这个,它工作正常:

vector<Bar> barList;

但是现在我失去了unique_ptr. 我想要我的蛋糕,我也想吃!

4

6 回答 6

12

这里的问题是,在某个地方,您的代码正试图调用Foo.

这会导致编译器尝试生成一个复制赋值运算符,该运算符调用 的所有子对象的复制赋值运算符Foo。最终,这导致尝试复制 a unique_ptr,这是不可能的操作。

于 2012-01-24T14:27:04.980 回答
6

unique_ptr没有复制语义,因此您不能使用任何可以复制包含对象的方法。您可以std::move通过在它试图复制的地方使用右值引用来做到这一点。没有看到你的代码,我不能说那会在哪里。

如果它以第二种形式编译,要么您没有使用相同的代码,要么存在编译器错误。两者都应该以同样的方式失败。

您的第三个示例,按值存储是最简单的方法,除非您的对象很大且按值存储/复制的成本很高。

于 2012-01-24T14:33:29.267 回答
4

通常 astd::move(iUniquePtr)在某处丢失(例如,在使用 push_back 时)。

于 2014-02-07T11:08:42.030 回答
0

摘自 www.cplusplus.com

std::unique_ptr::operator=

unique_ptr assignment 对象获得 x 内容的所有权,包括存储的指针和存储的删除器(以及在某个时刻删除对象的责任)。在调用之前由 unique_ptr 对象拥有的任何对象都将被删除(就像调用了 unique_ptr 的析构函数一样)。

但也有一个警告:

本页介绍了最新版本的 C++ 标准 (2011) 引入的功能。较旧的编译器可能不支持它。

MSVC 2010 定义operator=为私有(不可复制)但支持swap方法。

于 2014-05-29T09:05:15.920 回答
0

通常的问题erase()emplace*()push*()。这些将尝试移动矢量元素,因为其中一个或多个被删除或插入。虽然这应该可以工作,因为std::unique_ptr可移动和移位不是严格要求的,但有时不能,原因是STL实现中的错误。std::list出于这个原因,您可能会更好,使用std::shared_ptrs,使用std::vector替代方案,提交错误,或者只使用原始指针,这是一个非常简单和有效的解决方案。

于 2021-11-12T08:09:39.280 回答
-3

您不能在向量中使用 unique_ptr,因为向量实现强烈依赖于值分配运算符,该运算符在unique_ptr. shared_ptr从 C++11 的 boost 或其他智能 ptr 实现中使用。

于 2012-01-24T14:28:33.907 回答