【发布时间】:2012-06-20 17:28:45
【问题描述】:
我知道当通过值传递一个对象给函数时,如果有一个移动构造函数,总是会调用它,假设没有复制省略。按值返回对象呢?
例如,假设我们有一个类Foo,它有一个移动构造函数,我们有一个函数返回一个Foo 对象。
Foo g() {
Foo f;
// do something with f
return f;
}
如果我们假设没有 RVO,是否保证调用移动构造函数?
更新:我想我没有清楚地表明我的意图。我只是想知道在最坏的情况下我可以让对象移动而不是复制。 RVO 或 NRVO 发生,我很高兴。而且我还应该说move构造函数和move赋值没有被删除,并且是正确实现的。
【问题讨论】:
-
是的,自动存储中的本地对象在 return 语句中被隐式视为 xvalues。
-
@ildjarn:我认为只有直接退货。在某处,我被纠正说这将
f移动到函数中:return do_something(f);。 -
@GManNickG :我没有时间了解标准或警告,因此是评论而不是答案。我认为你是对的。 :-]
-
@ildjarn:我其实暗地里希望你能纠正我说它确实移动了它(这更有意义该死!)。那好吧。 :)
-
@GManNickG:确切的引用来自 12.8/31:“在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象的名称时(除了函数或 catch 子句参数)具有与函数返回类型相同的 cv 非限定类型,则可以通过将自动对象直接构造到函数的返回值中来省略复制/移动操作。
标签: c++ c++11 return-value move-semantics