右值引用 — 我正在失去值

rvalue reference — I'm losing the value

本文关键字:失去 引用      更新时间:2023-10-16

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

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;

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

不返回引用,返回值和std::move() password out:

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