4

I came across this code recently but don't quite understand what's going on.

auto c = vector<int> {};

What is the vector constructor returning?

Then this code:

c = vector<int> {1,2,3,4,5 };

Is the second c at a different memory location to the initial c?

Is the destructor called when c is reinitialised?

I searched the internet but could not find any examples of the above code.

How is the above different to

vector<int> c {};

Thanks in advance for any help.

4

5 回答 5

5

“正如 jrd1 所说,这是一个 C++11 特性。

关键字auto基本上意味着您让编译器“猜测”变量的类型。

c常规也是如此vector<int>

于 2013-10-11T11:24:51.687 回答
3

向量构造函数返回什么?

一个空vector<int>c并且编译器从该构造函数调用中推断出变量的类型,这意味着c将获得 type vector<int>auto基本上只是让您免于输入两次变量类型 - 它已经在构造函数调用中给出,您现在不必再次在变量名前面输入它,您可以使用它auto

第二个 c 是否与初始 c 位于不同的内存位置?

不,它是同一个向量;但是来自另一个临时vector<int>的值(包含值 1、2、3、4 和 5)被分配给cvia operator=。这意味着,c它本身 ( &c) 的地址不会改变。但是,它包含的数据(例如 的结果c.data())可以而且很可能会改变。

重新初始化 c 时是否调用析构函数?

Notc的析构函数。只有一个从临时。

于 2013-10-11T11:28:49.940 回答
2

“第一个 c”是定义变量 c(int 向量)的位置。

auto c = vector<int> {};

“第二个 c”只是重新分配 c 的值。它不是一个新变量,因此 c 的内存地址不会改变,并且不会调用 c 的析构函数。

c = vector<int> {1,2,3,4,5 };

实际发生的是向量 {1,2,3,4,5 } 创建了一个向量类型的临时对象,该对象从初始值设定项列表中初始化,值为 1,2,3,4,5。然后将此临时对象传递给 c 的复制构造函数(或 C++11 中的移动构造函数),以便 c 将其当前值(如果有)替换为临时对象中的值。

c 的析构函数在超出范围之前不会被调用(例如,函数退出或定义它的控制块 {} 退出)。

于 2013-10-11T11:38:37.977 回答
1

C++11 包含 auto 关键字,可以为您进行类型推断
它有助于大大简化代码。
例子:

auto itr = vec.iterator(); // instead of vector<int>::iterator itr
于 2013-10-11T11:40:47.270 回答
1

第一行和最后一行在功能上是等效的。

对于作业:

c = vector<int> {1,2,3,4,5 };

c 将不会被破坏或随后位于新的内存操作中。发生的情况是,将使用 5 个值创建一个未命名的第二个向量,并将vector::operator=用于将该向量的内容分配给 c。这将在 C++11 中的移动操作中发生。之后临时向量将被销毁并调用它的析构函数,但不会调用 c 的析构函数。

于 2013-10-11T11:31:49.830 回答