C++ 0x中的R值

Goo*_*ofy 3 c++11

Rvalues恕我直言是C++的重大改进,但在开始时似乎很混乱.请看下面的代码:

#include <string>

std::string && foo (void)
{
    std::string message ("Hello!");

    return std::move (message);
}

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

int main ()
{
    bar (foo ());
}
Run Code Online (Sandbox Code Playgroud)

引用message2message返回的原始对象的最后一个所有者foo(),对吧?

Tho*_*tit 9

不,这不对.当你发现rvalue参考时,你会陷入通常的陷阱,就像Motti在接受的答案中一样!(我在早期的rref测试中也犯了这个错误)

如果你不想在处理rref时用脚射击自己,请将其内化:

在大多数情况下,返回右值引用的函数与返回普通引用的函数一样愚蠢.

因为右值引用是......引用!因此,如果您返回一个引用 - 是否为rvalue message,则返回对刚被销毁的对象的引用,因为它超出了范围,因此您返回一个悬空引用.这是一个错误.

另外,不要写,return std::move(message)因为编译器已经知道它message是一个临时值(一个rvalue),所以不需要用std :: move重新编写它.实际上,写入return std::move(something)可以防止优化(至少在MSVC10上,它似乎禁用了RVO).

所以,正确而有效的方法是:

#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());
}
Run Code Online (Sandbox Code Playgroud)

好老C++ 03 :)
因为NRVO开始并且没有复制,没有移动,只有一个构造.