C++ 右值参考—;I';我失去了价值

C++ 右值参考—;I';我失去了价值,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,我对右值引用有点困惑,因此我尝试了以下代码: std::vector stringToChar(std::string&str) { 向量表示(str.begin(),str.end()); 返回代表; } std::vector和cryptPassword(std::vector和密码) { //静态常量char _key=56;//密码 //用于(字符和c:密码) //c=c^_键; 返回(密码); } std::vector和stringToPassword(std::string和str

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

std::vector stringToChar(std::string&str)
{
向量表示(str.begin(),str.end());
返回代表;
}
std::vector和cryptPassword(std::vector和密码)
{
//静态常量char _key=56;//密码
//用于(字符和c:密码)
//c=c^_键;
返回(密码);
}
std::vector和stringToPassword(std::string和str)
{
返回cryptopassword(stringToChar(str));
}
在第一种情况下,我得到了正确的输出,但在第二种情况下,我得到了垃圾

std::string str(“你好”);
std::vector tmp=cryptPassword(stringToChar(str));
//正确输出
用于(字符c:tmp)

std::coutstringToChar(str)
的结果是一个右值,它将绑定到
cryptPassword()
获取的右值引用。返回
password
时,向量被复制并绑定到引用(
cryptopassword()
返回左值引用)。问题在于,返回值是一个临时副本,在调用
temp=stringToPassword()
后,该副本已失效。使用它是未定义的行为

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

std::vector密码(std::vector&&password)
{
// ...  
返回std::move(密码);
}

谢谢,我开始明白了。我会做更多的测试来理解它是如何工作的。做上面的更改不会使代码编译。我得到以下错误“error:对'vector'类型的非常量左值引用无法绑定到'vector'类型的临时变量”。@Rush根据OP首先编译的代码,但问题是他得到了一个垃圾输出。@Rush我明白了,谢谢。你确定从返回类型中删除了引用吗?是的,我删除了。我从这里复制粘贴了它。我是否也必须从“stringToPassword”函数中删除引用?这对我有效
stringToChar
stringToPassword
应该采用常量引用,因为它们不修改参数。(这样做会引发编译器错误以提醒您该问题,而不是为第二个代码段运行并产生垃圾)