我正在使用 VC++2012 运行以下代码:
#include <utility>
struct A
{
int* m_p;
A() { m_p = new int; }
~A() { delete m_p; }
A(const A& otherA)
{
m_p = new int;
// BOOM!
*m_p = *otherA.m_p;
}
};
A&& CreateA()
{
A a;
return std::move(a);
}
int _tmain(int argc, _TCHAR* argv[])
{
A a2 = CreateA();
return 0;
}
在创建 a2 期间,A 的复制 ctor 被调用 - 并且崩溃,因为在 CreateA() 中创建的源对象已经被销毁。这是标准行为吗?这可能是编译器错误吗?
请注意,如果您将 a2 的类型从“A”更改为“const A&”,则不会发生崩溃——这加强了对它确实是一个错误的怀疑。任何人都可以对此有所了解吗?
注意:我完全知道这不是 rvalue-refs 的预期用途,这个例子是人为的。只是希望能更好地掌握这种新类型的行为。