是否可以将std :: move对象移出函数?(C++ 11)

Tre*_*key 12 c++ function rvalue-reference move-semantics c++11

该程序试图将一个字符串移出一个函数并用它来构造另一个字符串:

#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);
}
Run Code Online (Sandbox Code Playgroud)

程序编译,但执行时会出现段错误.


这是我的理由: Get_String将创建一个本地字符串.在字符串超出范围之前,需要创建并返回该字符串的副本.该副本将用于在main中构造字符串.但是,如果我将字符串移出函数,则不需要复制.

为了理解移动语义,有人可以解释为什么我在做什么,可能没有任何意义.是否可以将对象移出函数?


编辑:
如果我更改函数签名,它编译并正确运行:

std::string && Get_String(void);
Run Code Online (Sandbox Code Playgroud)

std::string Get_String(void);  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在返回期间移动字符串是否仍然更有效?

bil*_*llz 18

鉴于这个例子,

X foo ()
{
  X x;    
  return x;
}
Run Code Online (Sandbox Code Playgroud)

保证以下行为:

•如果X具有可访问的副本或移动构造函数,编译器可以选择忽略该副本.这就是所谓的(命名)返回值优化((N)RVO),它甚至在C++ 11之前就被指定并且得到了大多数编译器的支持.
•否则,如果X有移动构造函数,x则移动.
•否则,如果X有复制构造函数,x则复制.
•否则,将发出编译时错误.

另请注意,如果返回的对象是本地非静态对象,则返回rvalue引用是错误的:

X&& foo ()
{
  X x;
  return x; // ERROR: returns reference to nonexistent object
}
Run Code Online (Sandbox Code Playgroud)

右值引用是一个引用,并在引用本地对象时返回它意味着您返回对不再存在的对象的引用.是否std::move()使用无所谓.

std::move()并没有真正移动物体; 它只会将左值变成右值.