3
class A
{
public:

    A ()
    {
        wcout << L"Empty constructed." << endl;
    }

    A (LPCWSTR Name)
        : m_Name(Name)
    {
        wcout << L"Constructed." << endl;
    }

    friend void swap (A& Lhs, A& Rhs)
    {
        using std::swap;

        swap(Lhs.m_Name, Rhs.m_Name);
    }

    A (A&& Other)
    {
        wcout << L"Move constructed." << endl;

        swap(*this, Other);
    }

    A (const A& Other)
        : m_Name(Other.m_Name)
    {
        wcout << L"Copy constructed." << endl;
    }

    A& operator= (A Other)
    {
        wcout << L"Assignment." << endl;

        swap(*this, Other);

        return *this;
    }

    ~A ()
    {
        wcout << L"Destroyed: " << m_Name.GetString() << endl;
    }

private:

    CString m_Name;
};


int
wmain ()
{
    A a;

    a = A(L"Name"); // Where is the construction of this temp object?

    return 0;
}

これは、上記のコードで得られる出力です。

Empty constructed.
Constructed.
Assignment.
Destroyed:
Destroyed: Name

コメントのある行を参照してください。私が期待したのは、一時オブジェクトがそこで構築され、operator =の引数Otherが、その一時オブジェクトからmove-constructedになることです。ここで何が起こっているのですか?

4

2 に答える 2

8

「構築済み」という出力は、実際にはその一時オブジェクトの構築からのフィードバックです。

コピー代入演算子のパラメーターの追加のコピー構築(または移動構築)を探している場合は、Otherおそらくコピーの省略によって削除されました。あなたA(L"Name")はすぐに構築され、そのOtherパラメータとして使用されます。余分なコピー(または移動)は実行されません。

于 2012-07-31T22:19:08.577 に答える
2

インタラクティブデバッガーを使用して、自分の目で確かめることができます。ただし、「名前」が作成された場所に対するあなたの答えは次のとおりです。

A (LPCWSTR Name) 
    : m_Name(Name) 
{ 
    wcout << L"Constructed." << endl; 
} 

 a = A(L"Name");

コードは、コード行に空のオブジェクトを作成しましたA a;

次に、「名前」を作成しました。

次に、2つを交換しましたCString m_Name;(出力に表示されますAssignment)。

次に、「名前」(A(L"Name"))を保持している元のオブジェクトを破棄しました。

次に、現在「Name」を保持している元の空のオブジェクトを破棄しましたm_Name

于 2012-07-31T22:20:05.980 に答える