返回右值 - 这段代码出了什么问题?

Jam*_*nco 2 c++ rvalue-reference move-semantics c++11

我遇到了以下代码段

std::string&& test()
{
    std::string m="Hello";
    return (std::move(m));
}

int main()
{
     std::string&& m = test();
}
Run Code Online (Sandbox Code Playgroud)

我理解上面的代码不正确且不安全,但我不确定原因.到目前为止,这是我对代码的理解.在功能test

  1. 在堆栈上创建一个std::string调用的局部变量m.

  2. 然后返回此字符串,但不是复制,而是将其内容移动到临时字符串.此时函数test结束调用变量的析构函数m(其内容被移动到temp)

  3. 临时值现在绑定到右值引用m.根据我的理解,一个临时的将保持活着,直到它的绑定对象存在并且在范围内.

有人可以告诉我哪里可能出错了吗?为什么上面的代码不安全?

Pra*_*ian 6

右值引用仍然是引用,您的代码不正确的原因与下面显示的函数相同

std::string& test()
{
    std::string m="Hello";
    return m;
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,该函数都返回对局部变量的引用.std::move不会做的比其他投什么mstring&&,所以没有临时创建mmain,然后结合.当test退出时,本地变量被破坏,并且m是悬空参考.

要修复代码,请将返回类型更改string&&string.

std::string test()
{
    std::string m="Hello";
    return m;   // std::move is redundant, string will be moved automatically
}

int main()
{
     std::string&& m = test();
}
Run Code Online (Sandbox Code Playgroud)

现在min main可以绑定到返回值test,并且它的生命周期被扩展为匹配的值m.