gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:13:16 31 4
gpt4 key购买 nike

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

#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 中的字符串。但是,如果我将字符串移出函数,则不需要进行复制。

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


编辑:
如果我从以下位置更改函数签名,它将正确编译并运行:

std::string && Get_String(void);

std::string Get_String(void);  

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

最佳答案

鉴于这个例子,

X foo ()
{
X x;
return x;
}

保证以下行为:

• If X has an accessible copy or move constructor, the compiler may choose to elide the copy. This is the so-called (named) return value optimization ((N)RVO), which was specified even before C++11 and is supported by most compilers.
• Otherwise, if X has a move constructor, x is moved.
• Otherwise, if X has a copy constructor, x is copied.
• Otherwise, a compile-time error is emitted.

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

X&& foo ()
{
X x;
return x; // ERROR: returns reference to nonexistent object
}

右值引用是一个引用,在引用本地对象时返回它意味着你返回对不再存在的对象的引用。是否使用 std::move() 不问题。

std::move() 并没有真正 move 对象;它只会将左值转换为右值。

关于c++ - 是否可以将 std::move 对象移出函数? (C++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618506/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com