"auto x = vector<int>()"和"vector<int> x"有什么区别?

What's the difference between "auto x = vector<int>()" and "vector<int> x"?

本文关键字:lt gt int vector 什么 区别 auto      更新时间:2023-10-16

两者之间有什么区别:

auto x = vector<int>();

vector<int> x;

这两个声明是等效的,还是与运行时复杂性有一些区别?

自 C++17 以来,它们具有相同的效果。两者都构造一个名为 x 的对象,类型为 std::vector<int>,该对象由默认构造函数 std::vector 初始化。

确切地说,第一个是副本初始化,x是从值初始化的临时副本初始化的。从 C++17 开始,这种复制省略是有保证的,因为结果xstd::vector 的默认构造函数直接初始化。在 C++17 之前,复制 elision 是一种优化:

即使它发生并且没有调用复制/移动(自 C++11 以来(构造函数,它仍然必须存在且可访问(好像根本没有发生优化(,否则程序格式不正确:

第二个是默认初始化,因为类类型x由默认构造函数 std::vector 初始化。

请注意,其他类型的行为可能会有所不同,具体取决于类型的行为和x的存储持续时间。