C++中auto声明使用问题求助(Visual Studio 2017环境)
解决Visual Studio 2017中
auto声明的使用问题 嘿,我看你在VS2017里用auto的时候碰到问题了,代码写到一半断了,应该是在操作MyObj里的结构体容器时不知道怎么正确用auto对吧?我来帮你梳理正确的用法,同时排查可能踩的坑。
先补全你的代码场景,给你正确的auto用法示例
从你的代码片段来看,你应该是想给每个MyObj[a]刚添加的mystruct里的vi容器塞数据,或者后续遍历这些元素。这里给你两种常见的正确auto使用方式:
场景1:用auto简化元素引用,高效添加数据
你之前的代码写到MyObj...就停了,咱们可以这样补全——用auto&获取刚添加的结构体引用,避免不必要的拷贝:
int main() { MyClass MyObj[3]; for (int a = 0; a < 3; a++) { MyObj[a].AddStructV(); // 用auto&拿到刚push_back的mystruct的引用,直接操作原对象 auto& target_struct = MyObj[a].TheStructV.back(); for (int i = 1; i <= 5; i++) { target_struct.vi.push_back(i); } } }
场景2:用auto配合范围for循环遍历容器
如果后续要遍历这些容器里的元素,auto能让代码简洁很多,不用写长长的类型名:
// 遍历MyObj数组里的每个对象 for (auto& obj : MyObj) { // 遍历每个对象的TheStructV容器 for (auto& s : obj.TheStructV) { // 遍历每个mystruct里的vi容器 for (auto num : s.vi) { cout << num << " "; } cout << endl; } }
排查VS2017里auto可能出问题的地方
- C++标准版本没开对:
VS2017默认支持C17,但如果你的项目还在用老标准(比如C03),auto会直接报错。去项目属性里改一下:右键项目→属性→配置属性→C/C→语言→C标准,选ISO C++17 标准(/std:c++17)就行(VS2017最高支持到C++17)。 auto没初始化:auto必须在声明的时候就赋值,比如auto var;这种写法编译器根本不知道要推导什么类型,肯定报错。- 忘了加
&导致拷贝:
如果只写auto而不是auto&,会把容器里的对象拷贝一份出来,不仅效率低,你修改拷贝出来的对象也不会影响原容器里的内容,这是很多初学者容易踩的坑。
给你一份完整可运行的代码
把这些知识点整合起来,你可以直接运行这段代码看看效果:
#include "stdafx.h" #include <stdio.h> #include <iostream> #include <vector> using namespace std; class MyClass { public: struct mystruct { vector<int> vi; }; vector<mystruct> TheStructV; void AddStructV() { TheStructV.push_back(mystruct()); }; }; int main() { MyClass MyObj[3]; // 给每个对象的容器填充数据 for (int a = 0; a < 3; a++) { MyObj[a].AddStructV(); auto& target = MyObj[a].TheStructV[0]; // 这里因为只添加了一个元素,所以取索引0 for (int i = 1; i <= 5; i++) { target.vi.push_back(i + a * 5); // 给不同对象的元素加个偏移,方便区分输出 } } // 用auto遍历输出所有元素 for (auto& obj : MyObj) { for (auto& s : obj.TheStructV) { cout << "当前结构体的vi元素:"; for (auto num : s.vi) { cout << num << " "; } cout << endl; } } return 0; }
运行后你会看到每个MyObj对应的vi容器输出不同的数值,auto的使用完全符合预期~
内容的提问来源于stack exchange,提问作者Chi-fung LAM
相关产品推荐
相关产品推荐

