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 の作成中に、CreateA() で作成されたソース オブジェクトが既に破棄されているため、A のコピー ctor が呼び出されてクラッシュします。これは標準的な動作ですか?これはコンパイラのバグでしょうか??
a2 の型を 'A' から 'const A&' に変更すると、クラッシュが発生しないことに注意してください。これは、実際にバグであるという疑いを強めます。誰でもこれに光を当てることができますか?
注: これが右辺値参照の意図された使用法ではないことは十分承知しており、この例は不自然です。この新しいタイプの動作をよりよく把握できることを願っています。