0

私は std::move について読んでいました。かなりの資料に基づいて、std::move は引数の型を右辺値参照に変換する単なる関数であると結論付けました。

また、右辺値参照は、引数を const 参照として受け取る関数で使用できることも読みました。オブジェクトの内容が変更されないことが保証されているため、これは意味があります。

これらのアイデアを検証するために、以下にあるクラスを使用して非常に簡単な実験を行いました。

オブジェクトt1を作成し、 std::moveを使用して右辺値参照に変換し、copy-constructor を呼び出して別のオブジェクトt2を作成しようとしました。

不思議な部分は、move-constructor を提供しなくても、意図的にそのパラメーターを非 const 参照として定義した copy-constructor で動作することです。

ただし、std::move がt1の型を右辺値参照に変換する場合、コンパイラはそれを左辺値参照にどのようにバインドできますか?

ところで、「Microsoft(R) Microsoft Visual Studio 2012 バージョン 11.0.50727.1」を使用しています。

ここで何が欠けているのか説明してもらえますか?

どうもありがとうございました。

#include <iostream>
#include <algorithm>

using namespace std;

class Trace {
    public:
        Trace() {
        }

        // @1
        Trace(Trace& t) {
            cout << "trace::trace(&)" << endl;
        }

        // @2
        Trace(Trace&& t) {
            cout << "trace::trace(&&)" << endl;
        }
};

int main(int argc, const char *argv[])
{
    Trace t1;

    // Calls @2 if it exists, otherwise calls @1 
    Trace t2(std::move(t1));
    return 0;
}
4

0 に答える 0