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

Aut*_*tch 31 c++ initialization stdvector language-lawyer

之间有什么区别?

auto x = vector<int>();
Run Code Online (Sandbox Code Playgroud)

vector<int> x;
Run Code Online (Sandbox Code Playgroud)

这两个声明是否相等,或者运行时复杂度是否有所不同?

son*_*yao 43

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

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

即使它发生并且没有调用copy / move(自C ++ 11起)构造函数,它仍然必须存在并且可以访问(好像根本没有优化发生),否则该程序格式错误:

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

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