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将从该临时对象中移动构造。这里发生了什么?
答案 0 :(得分:8)
显示“Constructed”的输出实际上是来自该临时对象构造的反馈。
如果您正在寻找复制赋值运算符的Other
参数的附加复制构造(或移动构造),则可能通过复制省略来消除它。您的A(L"Name")
会立即构建并用作Other
参数。不执行额外的复制(或移动)。
答案 1 :(得分: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
中保留了“名称”。