在Stackoverflow的帮助下,我写了一个输出 vector 之和的函数。我想问:
为什么第一个版本有效,为什么第二个版本无效。(找到答案 here。)- 如何理解
for (auto & n : v)
?我理解像for (auto ptr = v.begin(); ptr != v.end(); ptr++)
这样的代码,但是 1) 为什么我们传递& n
而不是n
?另外,:v
是什么?
谢谢!
// version 1 that works
int sumVector(vector<int> v){
int sum_of_vec = 0;
for (auto &n: v){
sum_of_vec += n;
}
return sum_of_vec;
}
// version 2 that does not work
int sumVector(vector<int> v){
int sum_of_vec; // do not specify sum_of_vec = 0
for (auto &n: v){
sum_of_vec += n;
}
return sum_of_vec;
}
(原始问题包含可能重复的帖子未完全涵盖的两部分)
最佳答案
当定义一个没有初始化的内置类型的对象时,它将被默认初始化。但是,内置类型的默认初始化实际上什么都不做!因此,读取未初始化的值是未定义的行为!在您可以从相应的对象读取之前,它需要被初始化!
这种有点奇怪的行为的原因是两个相当重要的用例需要它:
- 分配 [巨大] 对象数组时,它们通常会从某些来源接收非默认值,并且对它们进行值初始化会不必要地浪费时间。
- 将对象构造到内存映射 I/O 区域时,可能根本无法写入相应位置,否则可能会产生不利影响。
为了支持这两种用例,对象内置类型在未指定任何内容时未初始化。给对象赋值很容易:只需指定一个值或值初始化对象,例如:
int sum_of_vec{};
关于C++如何理解(auto & n : v)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911467/