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 将从该临时对象中移动构造。这里发生了什么事?

4

2 回答 2

8

显示“已构造”的输出实际上是该临时对象构造的反馈。

如果您正在寻找Other复制赋值运算符的参数的附加复制构造(或移动构造),它可能已被复制省略消除。YourA(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;

然后它构造了“名称”。

然后它交换了两者CString m_Name;(由输出显示Assignment)。

然后它破坏了持有“名称”()的原始对象A(L"Name")

然后它破坏了原来的空对象,该对象现在在其m_Name.

于 2012-07-31T22:20:05.980 回答