/*
std::move 的几种错误场景
*/
#include <iostream>
#include <string>
void reference(std::string& str)
{
std::cout << "左值" << std::endl;
}
void reference(std::string&& str)
{
std::cout << "右值" << std::endl;
}
void inc( int& v)
{
v++;
}
int main()
{
std::string lv1 = "string,"; // lv1 是一个左值
// std::string&& r1 = lv1; // 非法, 右值引用不能引用左值
std::string&& rv1 = std::move(lv1); // 合法, std::move可以将左值转移为右值
std::cout << rv1 << std::endl; // string,
const std::string& lv2 = lv1 + lv1; // 合法, 常量左值引用能够延长临时变量的生命周期
// lv2 += "Test"; // 非法, 常量引用无法被修改
std::cout << lv2 << std::endl; // string,string
std::string&& rv2 = lv1 + lv2; // 合法, 右值引用延长临时对象生命周期
rv2 += "Test"; // 合法, 非常量引用能够修改临时变量
std::cout << rv2 << std::endl; // string,string,string,Test
reference(std::forward<std::string &&>(rv2)); // 输出右值
reference(rv2); // rv2 虽然引用了一个右值,但由于它是一个引用
int s = 1;
inc(s); //错误 非常量左引用无法引用右值,s传给inc时 会产生临时变量,是个右值
return 0;
}
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2021/05/20 14:54