首先,直接初始化要求编译器使用普通的函数匹配来选择匹配的构造函数。而拷贝初始化要求编译器将右侧运算符拷贝到正在创建的对象,用的是拷贝构造函数或移动构造函数,拷贝构造函数是在初始化列表中创建对象,而不是在其后的函数体内赋值。
即vector<T>::push(const T &obj)构建新元素是使用传入的实例调用拷贝构造函数做拷贝初始化(拷贝到正在创建的新元素,是初始化列表的初始化过程),而vector<T>::emplace(args**)构建新元素是选择与传入的参数最匹配的构造函数直接初始化(使用普通的函数匹配,行为取决于匹配到的函数,不一定是初始化列表的初始化过程,可能是初始化后函数体的赋值过程)。