该程序尝试将字符串移出函数并将其用于构造另一个字符串:
#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);
在这种情况下,在返回期间移动字符串是否更有效?