“auto x = vector<int>()”和“vector<int> x”有啥区别?

Posted

技术标签:

【中文标题】“auto x = vector<int>()”和“vector<int> x”有啥区别?【英文标题】:What's the difference between "auto x = vector<int>()" and "vector<int> x"?“auto x = vector<int>()”和“vector<int> x”有什么区别? 【发布时间】:2019-09-06 01:50:58 【问题描述】:

有什么区别:

auto x = vector<int>();

vector<int> x;

这两个声明是等价的,还是在运行时复杂度上有一些不同?

【问题讨论】:

第一个导致调用默认构造函数和调用移动构造函数。第二个导致调用默认构造函数。即使编译器对两者都进行了优化以生成相同的程序集,第二个也是为了提高可读性。 请注意,并非所有类都相同。例如。 std::array&lt;int,10&gt;。第一个将初始化为全 0,第二个可能不会。 【参考方案1】:

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

恰好第一个是copy initialization,x 是从value-initialized 临时复制初始化的。从 C++17 开始,这种copy elision 得到保证,因为结果x 直接由std::vector 的默认构造函数初始化。在 C++17 之前,复制省略是一种优化:

即使它发生并且没有调用复制/移动(自 C++11 起)构造函数,它仍然必须存在且可访问(就好像根本没有发生优化一样),否则程序是非良构的:

第二个是default initialization,作为类类型xstd::vector的默认构造函数初始化。

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

【讨论】:

@HTNW 很确定它仍然是复制初始化。该术语是根据syntax 定义的,而不是语义。

以上是关于“auto x = vector<int>()”和“vector<int> x”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章