【发布时间】:2013-08-16 04:24:51
【问题描述】:
让一个类A 带有一个移动构造函数。考虑一下:
A get()
{
A a;
return std::move( a );
}
// later in the code
A aa = get();
这里对std:move 的显式调用强制调用A 的移动构造函数,因此它可能会在调用get() 时抑制返回值优化。因此,据说get() 的更好实现是这样的:
A get()
{
A a;
return a;
}
但是返回值优化不是 C++11 标准的一部分,所以WHAT IF编译器出于某种原因决定在调用get() 时不执行返回值优化。在这种情况下,A 的复制构造函数将在返回 get() 时被调用,对吗?
那么get() 的第一个实现不是更受欢迎吗??
【问题讨论】:
-
如果你的编译器决定在每个函数调用之前插入一百万个 nop 怎么办?您必须选择您的工具...而且 RVO 是标准的明确部分,它不是强制性。
-
不需要
std::move。如果可访问,A 的移动构造函数将被 12.8/32 调用。 -
@Vahagn 是的。这是一个两阶段的过载解决方案。首先,返回的对象被视为右值。如果在这种情况下重载决议失败,则将其视为左值。这里的重点是,返回的对象的类型与你的函数的返回类型相同......
-
如果你返回一个
A类型的对象,但函数的返回类型是B,而B有一个(移动)构造函数以A作为参数,那么如果你想移动语义,你必须明确写move。 -
再补充一点:如果移动构造函数是私有的或被删除的,那么无论拷贝构造函数是公共的还是私有的,代码都不会编译。
标签: c++ c++11 move-semantics return-value-optimization