【发布时间】:2012-02-02 05:10:23
【问题描述】:
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。然而,NOT调用copy assignment,BUT调用move assignment!结果,答案不是 14。
这让我很困惑。尽管从f() 和g() 返回的对象是临时的,但它们与其他一些对象共享一些信息。这意味着临时对象可能很快就会为共享信息做一些工作。所以我认为语义上调用复制分配将是正确的行为。
ps。我的编译器是g++4.7 20110430
【问题讨论】:
-
添加一个析构函数,你会开始看到巨大的问题
-
遵循 3/5 stackoverflow.com/questions/4782757/… 规则可能会有所帮助
标签: c++ c++11 rvalue-reference move-semantics