struct F
{
private:
int* data;
public:
F( int n )
{
data = new int;
*data = n;
}
F( int* p )
{
data = p;
}
F& operator=( const F& f )
{
*data = *(f.get_data());
return *this;
}
F& operator=( F&& f )
{
delete data;
data = f.data;
f.data = nullptr;
return *this;
}
F& operator=( int n ) { *data = n; return *this; }
F operator()()
{
F cpy_f( data );
return std::move( cpy_f );
}
int* get_data() const { return data; }
};
int main()
{
F f( 12 );
F g( 14 );
f() = g();
cout << *(f.get_data()) << endl;
}
この例では、f()
とはg()
それぞれ一時オブジェクトを返すため、一時オブジェクトf()=g()
の式は一時オブジェクトと等しくなります。値が正しくコピーされていれば、答えは14だと思っていたでしょう。ただし、コピー代入ではなく、ムーブ代入を呼び出します。結果として、答えは14ではありません。
これは私を本当に混乱させます。から返されるオブジェクトは一時f()
的g()
なものですが、他のオブジェクトと情報を共有しています。これは、一時オブジェクトが共有情報に対してまもなくいくつかの作業を実行する可能性があることを意味します。したがって、意味的にコピー割り当てを呼び出すことが正しい動作であると思われます。
ps。私のコンパイラはg++4.720110430です