“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<int,10>
。第一个将初始化为全 0,第二个可能不会。
【参考方案1】:
自 C++17 以来,它们具有相同的效果。两者都构造了一个名为x
,类型为std::vector<int>
的对象,该对象由std::vector
的默认构造函数初始化。
恰好第一个是copy initialization,x
是从value-initialized 临时复制初始化的。从 C++17 开始,这种copy elision 得到保证,因为结果x
直接由std::vector
的默认构造函数初始化。在 C++17 之前,复制省略是一种优化:
即使它发生并且没有调用复制/移动(自 C++11 起)构造函数,它仍然必须存在且可访问(就好像根本没有发生优化一样),否则程序是非良构的:
第二个是default initialization,作为类类型x
由std::vector
的默认构造函数初始化。
请注意,其他类型的行为可能会有所不同,具体取决于类型的行为和x
的存储持续时间。
【讨论】:
@HTNW 很确定它仍然是复制初始化。该术语是根据syntax 定义的,而不是语义。以上是关于“auto x = vector<int>()”和“vector<int> x”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章