C++11 R值,单位为C++;0x Roim-imHO在C++中是很好的改进,但在开始时,它相当混乱。请看下面的代码: #include <string> std::string && foo () { std::string message ("Hello!"); return std::move (message); } void bar (const std::string &message2) { if (message2 == "Bye Bye!") return; } int main () { bar (foo ()); } #包括 std::string&&foo() { 字符串消息(“你好!”); 返回std::move(消息); } 空栏(const std::string和message2) { 如果(message2==“再见!”) 返回; } int main() { 酒吧(foo()); }

C++11 R值,单位为C++;0x Roim-imHO在C++中是很好的改进,但在开始时,它相当混乱。请看下面的代码: #include <string> std::string && foo () { std::string message ("Hello!"); return std::move (message); } void bar (const std::string &message2) { if (message2 == "Bye Bye!") return; } int main () { bar (foo ()); } #包括 std::string&&foo() { 字符串消息(“你好!”); 返回std::move(消息); } 空栏(const std::string和message2) { 如果(message2==“再见!”) 返回; } int main() { 酒吧(foo()); },c++11,C++11,Referencemessage2是由foo()返回的原始message对象的最后所有者,对吗?编辑:返回r值引用不是您想要做的事情。这个答案最初是在我还在掌握C++11s r值引用时编写的 您是对的,message2将使用移动构造函数构造,因此它可能会分解foo中的message分配的内存,但是如果使用,则短字符串的移动构造函数不会比复制构造函数更有效 另一件需要注意的事情是,在返回值时,不必显式使用std::move,返回值被称为r值引用。不,这是不对的。当你发现右值引用时,你陷入了一个通

Reference
message2
是由
foo()
返回的原始
message
对象的最后所有者,对吗?

编辑:返回r值引用不是您想要做的事情。这个答案最初是在我还在掌握C++11s r值引用时编写的


您是对的,
message2
将使用移动构造函数构造,因此它可能会分解
foo
中的
message
分配的内存,但是如果使用,则短字符串的移动构造函数不会比复制构造函数更有效


另一件需要注意的事情是,在返回值时,不必显式使用
std::move
,返回值被称为r值引用。

不,这是不对的。当你发现右值引用时,你陷入了一个通常的陷阱,就像莫蒂在中一样!(在我之前使用右值引用的测试中,我也犯了这个错误。)

如果您不想在处理右值引用时伤到自己的脚,请将此内在化:

在大多数情况下,返回右值引用的函数与返回正常引用的函数一样愚蠢。

因为右值引用是。。。推荐人!因此,如果返回对
消息
的引用-rvalue或not-to,则返回对刚销毁的对象的引用,因为该对象超出范围,因此返回一个悬空引用。这是一只虫子

另外,不要编写
return std::move(message)
,因为编译器已经知道
message
不需要复制或移动,而是直接在调用站点的内存位置构建,因此不需要使用
std::move
重新编写。实际上,编写
return std::move(something)
会阻止优化

因此,正确和最有效的方法是:

#include <string>
std::string foo (void)
{
    std::string message ("Hello!");
    return message;
}

void bar (const std::string& message2)
{
    if (message2 == "Bye Bye!")
        return;
}

int main ()
{
    bar (foo());
}
#包括
std::字符串foo(void)
{
字符串消息(“你好!”);
返回消息;
}
空栏(const std::string和message2)
{
如果(message2==“再见!”)
返回;
}
int main()
{
bar(foo());
}
好的旧C++03:)

因为NRVO起作用,没有复制,没有移动,只有一种结构。

这个问题稍微混合了值和对象的概念。最后一个值为“
Hello!”
的对象是
main