auto、auto&、auto&&、const auto和const auto&的区别(常量和非常量的左右值引用)

for(auto x : vector)

auto会拷贝一份容器内的vector,在修改x时不会改变原容器当中的vector值,只会改变拷贝的vector。
因为拷贝发生在编译期间,所以并不会对运行速率造成很大影响。

#include 
#include 
 
using namespace std;
 
void printVec(vector<int>& vec) {
	for (int i = 0; i < vec.size(); i++)
		cout << vec[i] << endl;
}
 
int main() {
	vector<int> vec = {4,3,2,1,0 };
	cout<<"** for(auto x : vector)**"<<endl;
    //这个时候每个取出来的iter只是原来vec元素的副本,不会改变vec中任何元素
    //iter可以作为左值进行赋值,但只是在副本范围
	for (auto iter : vec) {
		iter = iter + 100;
	}
	printVec(vec);
 
	cout<<"**for(auto& x : vector)**"<<endl;
    //这个时候取出来的是 &iter,代表原来vec中元素的引用
    //如果对iter进行任何改变都会作用在vec上
	for (auto& iter : vec) {	//如果vec返回临时对象,用auto&&
		iter = iter + 100;
	}
	printVec(vec);
}

for(auto& x : vector),非常量左值引用

当需要对原数据进行同步修改时,就需要添加&,即vector的引用。
会在改变x的同时修改vector。

for(auto&& x : vector),非常量右值引用

当vector返回临时对象,使用auto&会编译错误,临时对象不能绑在non-const l-value reference (非常量左值引用),需使用auto&&(非常量右值引用),初始化右值时也可捕获

for(const auto& x : vector),常量左值引用

使用 const 可以避免无意中修改数据的编程错误;
使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参;
使用 const 引用能够让函数正确生成并使用临时变量(当传入实参与形参符合自动转换要求时可以通过临时变量进行自动类型转换)

const (常类型),不能作为左值
& (引用),不拷贝,不申请新空间,会对原vector修改
当我们不希望拷贝原vector(拷贝需要申请新的空间),同时不愿意随意改变原vector,那么我们可以使用for(const auto& x : vector),这样我们可以很方便的在不拷贝的情况下读取vector,同时不会修改vector。一般用在只读操作。

const auto x : vector,常量左值引用

该操作相对于const auto& x : vector只是少了引用(&),即会申请新的空间(拷贝),不经常使用。

const auto&& x:vector),常量右值引用无实际意义,可以被常量左值引用替代

常量与非常量的左值右值引用可以参考:C++11右值引用

你可能感兴趣的:(C++,c++)