C++11中auto访问类成员时,应使用.还是->的技术疑问
关于auto遍历指针容器时的成员访问问题
嘿,这个问题我刚学C++11的时候也纠结过,给你掰扯清楚哈~
首先得搞明白auto在这里的推导规则:你的myvec是std::vector<MyClass*>,也就是存储MyClass指针的容器。那我们逐个分析三种写法:
写法(1):
for(auto* item : myvec)
这里你显式告诉编译器item是指针类型,auto会推导成MyClass*,所以用item->x访问成员完全正确——指针访问对象成员本来就该用->运算符。写法(2):
for(auto item : myvec){ std::cout<< item.x <<std::endl; }
这个绝对不行!auto推导出来的item类型是MyClass*(和容器里的元素类型一致),而.运算符是用来访问对象或者引用的成员的,你不能用.去访问指针的成员——指针本身根本没有x这个成员,编译器直接会报错。写法(3):
for(auto item : myvec){ std::cout<< item->x <<std::endl; }
这个完全可行!auto会自动推导出item是MyClass*类型,所以用->访问x成员是正确的,和写法(1)的效果一模一样。只不过写法(1)显式加了*让类型更清晰,写法(3)靠auto自动推导,代码更简洁而已。
总结一下:当你用auto遍历存储指针的容器时,auto推导的元素类型就是容器里的指针类型,所以必须用->来访问指向对象的成员;如果误用.的话,编译器会直接报错,因为指针没有对应的成员。
内容的提问来源于stack exchange,提问作者thegreatemu
相关产品推荐
相关产品推荐

