我对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;
答案 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);
}