我有一个关于使用unique-ptrs的问题。我得到this answer建议使用移动对象。我定义如下的一类:在C++ 11中定义移动对象是否有意义?
class B {
const string objName;
public:
B (B &&) = default;
B & operator= (B &&) = default;
B (const B &) = delete;
B & operator= (const B &) = delete;
B(const string & name) :
objName(name) {
}
virtual ~B();
const string name() const { return objName;};
}
,我这个线叫B:
class A {
A(){}
void take(B b);
}
A a;
B b("test");
cout<<b.name();
a.take(std::move(b));
cout<<b.name();
我的问题:
- 即使我已经拖欠了移动构造函数,我不能写a.take(b),我正在编译错误。 (b)
- 在结果中,“测试”结果显示“复制构造函数”被删除,但似乎合乎逻辑的选择是使用移动构造函数,而不需要写入std :: move打印两次。为什么在调用move之后b对象没有被移除?如果b对象仍然存在并且它的一个副本已经发送给a.take(move(b)),那么这意味着我们没有任何用于右值对象的移动。
- 是否使用上述移动对象(删除复制构造函数和赋值运算符以及默认移动构造函数和移动赋值)是否是一种很好的做法?
尝试用更长的字符串替换“test”,看看会发生什么。一般而言,移动对象的值是不确定的;它可能是旧的价值或不是。 –
如果你想从它移动,你需要从'objName'中移除'const'。 –
@AlanStokes删除const会导致测试将被打印一次。这是否意味着永恒的记忆永远不会被移动?或者他们会被复制? – Govan