【发布时间】:2015-02-26 00:46:41
【问题描述】:
鉴于以下情况:
Foo getFoo()
{
Foo result = doSomeWork();
return result;
}
C++ 是否保证
result将被移动,而不是被复制?或者换一种说法,写return std::move(result)是多余的吗?在没有明确的
std::move强制转换的情况下,是否存在标准指定左值将被静默移动而不是复制的任何(其他)情况?
注意事项:
假设
Foo是可移动构造的。忽略复制/移动省略,这可能会另外应用。
【问题讨论】:
-
1) 是的。 2) No. 1) 也被歪曲了,因为标准没有“保证
result被移动”;实际上,可以省略整个构造函数。正确的是关于构造函数重载决议的一组更窄的规则。 -
@KerrekSB 2) 也可以,例如抛出异常可能会通过 move-ctor IIRC 复制初始化异常
-
std::move()实际上会抑制 NRVO。 -
你没有要求这个,但原因是因为很明显
result在return声明之后没有进一步的用途。大多数其他情况并不那么明显,因此标准更难以对其进行推理。 -
@DanNestor:当然,这一切都在本节末尾的 [class.copy] 中,目前是 12.8。
标签: c++ move move-semantics