Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建包含不可复制和不可分配对象的向量?_C++_C++11_Unique Ptr_Noncopyable - Fatal编程技术网

C++ 如何创建包含不可复制和不可分配对象的向量?

C++ 如何创建包含不可复制和不可分配对象的向量?,c++,c++11,unique-ptr,noncopyable,C++,C++11,Unique Ptr,Noncopyable,我有一节课 class A { public: A(int x): x_(x) {} void SetValue(int m) {x_=m}; private: DISALLOW_COPY_AND_ASSIGN(A); }; 我试图创建一个a型物体的向量 vector<std::unique_ptr<A>> objects; objects.reserve(10); for (int i = 0; i < 10; i++) { auto a

我有一节课

class A {
 public:
  A(int x): x_(x) {}
  void SetValue(int m) {x_=m};
 private:
   DISALLOW_COPY_AND_ASSIGN(A);
};
我试图创建一个a型物体的向量

vector<std::unique_ptr<A>> objects;
objects.reserve(10);
for (int i = 0; i < 10; i++) {
   auto a = MakeUnique<A>();
   a->SetValue(20);
   objects.emplace_back(a);
}
矢量对象;
保留地(10);
对于(int i=0;i<10;i++){
auto a=MakeUnique();
a->SetValue(20);
物体。向后放置(a);
}

这会导致对已删除构造函数的编译错误调用,
'std::unique_ptr'

std::unique_ptr
不可复制,因此需要将其移动到容器中:

for (int i = 0; i < 10; i++) {
   auto a = MakeUnique<A>();
   a->SetValue(20);
   objects.emplace_back(std::move(a));
}
for(int i=0;i<10;i++){
auto a=MakeUnique();
a->SetValue(20);
对象。向后放置(std::move(a));
}

C++17的可能替代方案:
auto&a=objects.emplace_back(MakeUnique());a->SetValue(20)
objects.emplace_back(MakeUnique());objects.back()->SetValue(20)
@Xirema虽然在这种情况下是等效的,但在
SetValue
可以引发异常的情况下,它通常会有不同的行为。通常,我更喜欢在将对象移交给承包商之前对其进行完全设置。@RustyX请参阅我之前的注释:在这种情况下等效,在可能出现异常时不同。
不允许复制和分配(a)
不应是定义复制选择器和分配运算符的宏,它应该是一个基类,将复制和分配运算符标记为已删除,并默认移动操作。@GuillaumeRacicot,虽然我总是从boost noncopyable驾驶,但我看不到宏上面的断言/公理的优点