C++:move的几种错误场景

/ C++ / 没有评论 / 2207浏览
/*
	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;
}