我有这段代码:
string&& getString() {
string s {"test"};
return move(s);
}
我尝试输出:
cout << getString() << endl;
它给我空输出。
当我使用时:
string getString() {
string s {"test"};
return move(s);
}
有效。
我的问题:
为什么第一个不工作?我移动了引用,因此不应该销毁本地对象?
第二个是否“复制”(不考虑RVO)?
答案 0 :(得分:1)
为什么第一个不起作用?我移动了引用,因此不应该销毁本地对象?
string&& getString() {
string s {"test"}; // s is a local variable
return move(s); // move doesn't really move object, it turns the object to rvalue
}
您正在返回对本地non-static
对象的右值引用
右值引用是一个引用,并在引用本地对象时返回它意味着您返回对不再存在的对象的引用。是否使用std :: move()并不重要,因为std::move
并没有真正移动对象,它将对象转换为右值
第二个是否“复制”(不考虑RVO)?
编译器应首先考虑RVO然后考虑move
(自C ++ 11以来),否则应该复制。另见this。
你只需要写:
string getString() {
string s {"test"};
return s;
}