右值引用 — 我正在失去值
rvalue reference — I'm losing the value
我对右值引用有点困惑,所以我尝试了以下代码:
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);
}
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 启动类函数作为失去引用的线程
- 为什么对引用的常量引用会失去其恒定性?
- 右值引用失去其性质
- 当构造函数退出时,指针将失去引用
- 右值引用 — 我正在失去值