C++11 详解:列表初始化、右值引用与移动语义
一、C++11 的发展历史
C++11 是 C++ 的第二个主要版本,并且是从 C++98 起的最重要的更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。在它最终由 ISO 在 2011 年 8 月 12 日采纳前,人们曾使用名称'C++0x',因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起,C++ 有规律地每 3 年更新一次。
二、列表初始化
1. C++98 传统的 { }
C++98 中一般数组和结构体可以用{}进行初始化。
struct Point { int _x; int _y; };
int main() {
int array1[] = { 1, 2, 3, 4, 5 }; // 先开 5 个整型类型的空间,再将值拷贝进去
int array2[5] = { 0 };
Point p = { 1, 2 };
return 0;
}
2. C++11 中的{}
- C++11 以后想统一初始化方式,试图实现一切对象皆可用{}初始化,{}初始化也叫做列表初始化。
- 内置类型支持,自定义类型也支持,自定义类型本质是类型转换,中间会产生临时对象,最后优化后变成直接构造。
- {}初始化的过程中,可以省略掉=。
- C++11 列表初始化的本意是想实现一个大统一的初始化方式,其次它在有些场景下带来的不少便利,如容器 push/insert 多参数构造的对象时,{}初始化会很方便。
#include <iostream>
#include <vector>
using namespace std;
struct Point { int _x; int _y; };
class Date {
public:
Date(int year = 1, month = , day = ) :_year(year), _month(month), _day(day) {
cout << << endl;
}
( Date& d) :_year(d._year), _month(d._month), _day(d._day) {
cout << << endl;
}
:
_year;
_month;
_day;
};
{
a1[] = { , , , , };
a2[] = { };
Point p = { , };
x1 = { };
Date d1 = { , , };
Date d11 = ;
Date& d2 = { , , };
Date d3 = { };
Date d4 = ;
Point p1{ , };
x2{ };
Date d6{ , , };
Date& d7{ , , };
vector<Date> v;
v.(d1);
v.((, , ));
v.({ , , });
;
}


