このコードを考えてみましょう:
#include <iostream>
#include <string>
using namespace std;
class Movable {
public:
Movable(const string& name) : m_name(name) { }
Movable(const Movable& rhs) {
cout << "Copy constructed from " << rhs.m_name << endl;
}
Movable(Movable&& rhs) {
cout << "Move constructed from " << rhs.m_name << endl;
}
Movable& operator = (const Movable& rhs) {
cout << "Copy assigned from " << rhs.m_name << endl;
}
Movable& operator = (Movable&& rhs) {
cout << "Move assigned from " << rhs.m_name << endl;
}
private:
string m_name;
};
int main() {
Movable obj1("obj1");
Movable obj2(std::move(obj1));
obj2 = std::move(obj1); // For demostration only
const Movable cObj("cObj");
Movable tObj(std::move(cObj));
tObj = std::move(cObj); // For demonstration only
}
その出力は次のとおりです。
Move constructed from obj1
Move assigned from obj1
Copy constructed from cObj
Copy assigned from cObj
ご覧のとおり、これらの行では、
Movable tObj(std::move(cObj));
tObj = std::move(cObj); // For demonstration only
cObj
に移動するつもりですtObj
(代入演算子を使用した2番目の移動は、純粋にデモンストレーションを目的としています)。ただし、出力でわかるように、cObj
はにのみコピーされtObj
ます。
上記の例は単なるデモンストレーションであり、これの実際の使用法はわかりません。しかし、私は尋ねます:
const
オブジェクトを移動できますか?- できれば安全ですか?
追加:私は尋ねるのを忘れました。const
オブジェクトを移動できる場合、どのようにすればよいですか?(const_cast
?)