このの例では、違いはありません。私たちは3 int
の値100で終わるでしょう。確かに異なるタイプとの違いかもしれません。たとえば、のは、vector<int>
のようなものを考えてみましょう:
std::vector<int> a = {1, 2, 3, 4, 5}; // a has size 5
auto a_copy = a; // copy a. now we have two vectors of size 5
auto a_move = std::move(a); // *move* a into a_move
最後の変数、a_move
は、a
の内部ポインタの所有権を取得します。だから私たちは結局a_move
がサイズ5のベクトルですが、a
は空になりました。 はcopy
よりはるかに効率的です(1000文字列のベクトルであれば、a_copy
は1000文字列のバッファを割り当て、1000文字列をコピーすることになりますが、a_move
は2つのポインタを割り当てます)。
他のいくつかのタイプでは、1が無効である可能性があります:多くの種類のために
std::unique_ptr<int> a{new int 42};
auto a_copy = a; // error
auto a_move = std::move(a); // OK, now a_move owns 42, but a points to nothing
、何の違いは、しかしありません:
std::array<int, 100> a;
auto a_copy = a; // copy 100 ints
auto a_move = std::move(a); // also copy 100 ints, no special move ctor
より一般的には:
T a;
auto a_copy = a; // calls T(const T&), the copy constructor
auto a_move = std::move(a); // calls T(T&&), the move constructor
'std :: move'は実際には何も移動しないことに注意してください。それはちょうどrvalue refへのキャストを実行するだけで、結果は有用にはrvalueですが、単純に 'a'という名前はありません。これらの2つの事実は、そこから移動するオブジェクトを提供することの一部ですが、実際に移動するオブジェクトではありません。だから、「動く」の後に尋ねることは赤いニシンです。 –