Vik*_*ehr 13 c++ move-semantics
鉴于此函数和函数调用:
std::string GetString() {
std::stringstream sstr;
const auto str = sstr.str();
return str;
}
const auto returnedStr = GetString();
Run Code Online (Sandbox Code Playgroud)
当我声明str为const时,是否会省略move-construction ?
Rei*_*ica 14
在您的情况下,returnedStr将从返回值中移动构造GetString(),但该返回值将从str(1)复制构造.如果str不是const,则返回值将从中移动构造.
请注意,在这两种情况下,返回值优化仍然适用,因此编译器仍然可以str直接在空间中构造返回值(甚至自身)returnedStr,跳过一个或两个复制/移动结构.这是由C++ 11 12.8/31授予的:
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用.在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间.没有优化就被破坏了.复制/移动操作的省略,称为复制省略,在以下情况下允许(可以合并以消除多个副本):
在
return具有类返回类型的函数的语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象(除函数或catch子句参数之外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作...
当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过将临时对象直接构造到目标中来省略复制/移动操作省略的复制/移动
第一个要点包括返回值构造的省略,另一个要点包括将返回值移入returnedStr.注意"相同的cv-unqualified"类型的要求,这意味着无论cv限定符如何,这都有效.
(1)请注意,如果我们讨论的是一个X除了std::string提供移动构造函数的类之外的类const X&&,那么实际上返回值将使用此构造函数构造(无论它可能具有什么语义).
Angew的答案是正确的,但谁能记住所有的语言律师规则?
为了帮助我更容易记住,我写了以下来自STL自己口中的规则.
15)不要将本地人作为const返回[16]
$抑制移动语义
16)当使用完全相同类型的值返回本地时不要使用move [16]
如果你这样做,将不会使用$ NVRO.
17)不要通过Rvalue参考(&&)返回[16]
$除非你真的知道你在做什么.
笔记:
[16]不要帮助编译器,2013年本土化,http://www.youtube.com/watch?v = AKtHxKJRwp4