///< 构造函数调用
///---> 1. 调用所有虚基类的构造函数, 从左到右, 又深到浅
// a.列入初始化列表中的成员初始化
// b.未列入初始化列表的成员,对象调用默认构造函数
// c.初始化vfptr, vbfptr
///---> 2. new expression, operator new , placement new
/// a. new A() (三个步骤)
// ---> operator new (sizeof(A))
// ---> ctor()
// ---> assign addr to pointer
///---> 3. delete 野指针情况
///---> 4. virtual 析构函数, 在基类指向子类的情况下析构,析构时需要调用子类的析构函数
///c++11引用绑定规则:
// a. 非常量左值引用(X&) : 只能绑定到X类型的对象
// b. 常量左值引用(const X&) : 可以绑定到X, const X类型的左值对象,也可以绑定X,const X的右值对象
// c. 非常量右值引用(X&&) : 只能绑定到X类型的右值
// d. 常量右值引用(const X&&) : 可以绑定到X,const X类型的右值
int i = 0;
const int ii = 0;
int &j = i; ///> a
const int& k = i; ///> b
const int& g = 101; ///> b
const int& m = std::move(i); ///> b
const int& m0 = ii; ///> b
int &&n = std::move(i); ///> c
int &&o = 102; ///> c
int &&o1 = (i + k); ///> c
const int&& p = std::move(i); ///> d
const int&& q = 103; ///> d
const int&& r = static_cast<int&&>(i);
/// 引用叠加
// Type& & --> Type&
// Type& && --> Type&
// Type&& & --> Type&
// Type&& && --> Type&&
// eg:
// template<typename T> void func(T&& f);
// auto fp = func<int&&>();
// ---> decaltype(fp) -> void (*)(int&& && f);
// ---> void (*)(int&& f);