右值参考 - 我正在失去价值

时间:2014-08-03 00:30:01

标签: c++ c++11 rvalue-reference

我对rvalue引用有点困惑,所以我尝试了以下代码:

std::vector<char> stringToChar(std::string& str)
{
    std::vector<char> rep(str.begin(), str.end());
    return rep;
}

std::vector<char>& cryptPassword(std::vector<char>&& password)
{
    // static const char _key = 56; //crypt password
    // for (char &c : password)
    //   c = c ^ _key;
    return (password);
}

std::vector<char>& stringToPassword(std::string& str)
{
    return cryptPassword(stringToChar(str));
}

在第一种情况下,我得到了正确的输出,但在第二种情况下我得到了垃圾。

std::string str("Hello");
std::vector<char> tmp = cryptPassword(stringToChar(str));

//correct output
for (char c : tmp)
   std::cout << c;
std::cout << std::endl;

//garbage
tmp = stringToPassword(str);
for (char c : tmp)
   std::cout << c;
std::cout << std::endl;

1 个答案:

答案 0 :(得分:2)

stringToChar(str)的结果是一个rvalue,它将绑定到cryptPassword()所采用的右值引用。返回password时,向量被复制并绑定到引用(cryptPassword()返回左值引用)。问题是返回值是一个临时副本,该副本在调用temp = stringToPassword()之后已经死亡。使用它是未定义的行为。

不是返回引用,而是按值返回std::move() password

std::vector<char> cryptPassword(std::vector<char>&& password)
{
    // ...  
    return std::move(password);
}