RVO 是一种编译器优化,但可以提供非常有用的性能提升。但是,它不能保证,也不能依赖。
语言标准本身有什么可以优化返回值的吗?移动语义仍然复制成员值,对吗?
当以某种方式从函数返回时,C++11 保证了隐式移动。
此外,您可以通过return {a,b,c};
语法使用任何隐式构造函数直接构造返回值。
最后,如果失败,rvo 将成为隐式移动,并且上面的第一个隐式移动通常会变成 nrvo,因此这些技术很好地对齐。
我不知道我是否误解了您的问题,但 (N)RVO 实际上是“语言标准本身”。这称为复制省略,并在 §12.8.31 中描述。
实际上,移动构造比 RVO 在计算上更昂贵,因为正如您所说,它仍然必须将成员变量从一个内存位置“复制”到另一个内存位置(对象的浅拷贝)。RVO 完全消除了这些读/写操作。
(N)RVO 在大多数情况下都有效,并且在它不能(当函数可以返回多个变量之一时)移动构造开始。
AFAIK 有一个共识,即自 C++11 以来,您所称的“优化返回值”的所有情况都已充分涵盖