当前位置:   article > 正文

range-based for_auto elem=*()

auto elem=*()
for(auto elem:sum) {
    //statement
}
  • 1
  • 2
  • 3

statement对elem的操作不会传递到sum上,因elem是临时的变量,从对range-based for的展开的代码中可以看到。

for(auto pos = sum.begin(), auto end = sum.end(); pos != sum.end(); ++pos) {
	auto elem = *pos;
	//statement
}
  • 1
  • 2
  • 3
  • 4

当elem为引用时,statement对elem的操作会传递到sum上。

for(auto& elem:sum) {
	//statement
}
  • 1
  • 2
  • 3

引用的range-based for展开后代码如下:

for(auto& pos = sum.begin(), auto& end = sum.end(); pos != sum.end(); ++pos) {
	auto& elem = *pos;
	//statement
}
  • 1
  • 2
  • 3
  • 4

elem是引用,而又不期望sum中的元素值发生改变可以加const

for(const auto& elem:sum){
	//statement
}
  • 1
  • 2
  • 3

下面看一种新奇的用法,string默认转换为类C的对象

class C 
{
  public:	
	C(const string& str);
};
vector<string> vs;
for (const C& elem : vs) {
	//statement
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果C的构造函数前面加上explicit,则上面的用法会报错,string无法转换为C对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/795572
推荐阅读
相关标签
  

闽ICP备14008679号