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.的C++ 0x:当一个临时对象等于另一个临时对象
这让我很困惑。尽管从f()
和g()
返回的对象是临时的,但他们与其他一些对象共享某些信息。这意味着临时对象可能会很快为共享信息做一些工作。所以我认为在语义上调用复制分配将是正确的行为。
ps。我的编译器是g ++ 4.7 20110430
添加一个析构函数,你会看到很大的问题 – 2012-02-02 05:53:05
遵循3/5规则可能会有所帮助http://stackoverflow.com/questions/4782757/rule-of-three-becomes-rule-of - 五 - 与-C11 – Cubbi 2012-02-02 05:57:03