返回一个右值——这段代码有什么问题?

Returning an rvalue - what is wrong with this code?

我发现了以下代码片段

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

int main()
{
     std::string&& m = test();
}

我知道上面的代码不正确且不安全,但我不确定为什么。 到目前为止,这是我对代码的理解。在函数 test

  1. 在堆栈上创建了一个名为 m 的局部 std::string 变量。

  2. 然后返回此字符串,但它的内容被移动到临时文件中,而不是制作副本。此时函数 test 结束调用变量 m 的析构函数(其内容已移至临时)

  3. 临时文件现在绑定到右值引用 m。据我了解,临时对象将保持活动状态,直到其绑定对象处于活动状态并在范围内。

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

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

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

在这两种情况下,函数 return 都是对局部变量的引用。 std::move 除了将 m 强制转换为 string&& 之外什么都不做,因此没有临时创建 main 中的 m 然后绑定到。当test退出时,局部变量被销毁,m是悬空引用。

要修复您的代码,请将 return 类型从 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();
}

现在 main 中的 m 可以绑定到 test 的 return 值,并且 lifetime of that is extended 可以与 [=13= 的值匹配].