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驾驶,但我看不到宏上面的断言/公理的优点