【发布时间】:2012-11-17 02:19:48
【问题描述】:
这个程序试图将一个字符串移出一个函数并用它来构造另一个字符串:
#include <iostream>
#include <string>
#include <utility>
std::string && Get_String(void);
int main(){
std::string str{Get_String()};
std::cout << str << std::endl;
return 0;
}
std::string && Get_String(void){
std::string str{"hello world"};
return std::move(str);
}
程序可以编译,但执行时会出现段错误。
这是我的理由:Get_String 将创建一个本地字符串。在字符串超出范围之前,需要制作并返回该字符串的副本。该副本将用于构造 main 中的字符串。但是,如果我将字符串移出函数,则不需要进行复制。
为了理解移动语义,有人可以解释为什么我在做什么,可能没有意义。是否可以将对象移出函数?
编辑:
如果我从以下位置更改函数签名,它将正确编译并运行:
std::string && Get_String(void);
到
std::string Get_String(void);
在这种情况下,在返回期间移动字符串是否仍然更有效?
【问题讨论】:
-
RVO 解决了这个问题。不要使用
std::move禁用它。 -
@chris 我应该按值返回,无论如何编译器都会优化我正在做的事情?
-
是的,任何现代编译器都应该省略副本。
-
悬空引用是悬空引用;不管是左值还是右值引用。
标签: c++ function c++11 move-semantics rvalue-reference