例如:可以std :: move()或它的显式等价于本地变量allow elision?
Big create()
{
Big x;
return std::move(x);
// return static_cast<typename std::remove_reference<T>::type&&>(t) // why not elide here?
}
假设应用std::move()
返回一个局部变量抑制移动的语义,因为编译器不能做出的一般功能的内部工作,有关情况下,当这些假设是什么做任何假设没有必要的,例如当:
std::move(x)
内联(可能永远)std::move(x)
写为:static_cast<typename std::remove_reference<T>::type&&>(t)
根据目前的标准,实现允许应用NRVO ...
- return语句中与类返回类型,一种功能,当 表达的名称将与 (忽略cv-qualification)相同类型的非易失性自动对象( 函数参数或由 异常声明处理程序(18.3)引入的变量)作为函数返回类型,副本/移动 操作可以通过构造auto来省略matic对象直接拨入函数调用的返回对象
显然,1)和2)都不具备资格。除了使用std::move()
返回本地变量的事实是多余的,为什么是必要的限制?
类似std :: move()的转换是在编译时执行的,所以elision是没有意义的;它们只是编译器改变如何看待类型的指示。 –
[在返回的对象上使用'std :: move()'是多余的。](https://stackoverflow.com/a/14856553/501250) – cdhowie
“假设本地变量上的std :: move()移动语义等因素等“ - 听起来不对。 – einpoklum