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开始,保证了这种复制省略,因为结果x是std::vector直接由默认构造函数初始化的。在C ++ 17之前,复制省略是一种优化:
即使它发生并且没有调用copy / move(自C ++ 11起)构造函数,它仍然必须存在并且可以访问(好像根本没有优化发生),否则该程序格式错误:
第二个是默认初始化,因为类类型x是由默认构造器初始化的std::vector。
请注意,其他类型的行为可能有所不同,具体取决于类型的行为和x存储时间。