The {1, 2, 3}
不能推导出initializer_list<int>
在这种情况下(这就是vector<int>
你想要使用的构造函数期望。)所以你需要帮助它一点:
matrix.emplace_back(initializer_list<int>{1, 2, 3});
使用时不需要这样做push_back()
。我不知道具体细节,但是emplace_back()
是一个函数模板,而push_back()
不是。模板的推导规则不同(更严格)。并且花括号初始化器没有类型。因此,它对于类型推导的工作方式有自己的特殊规则。
至于效率,这个:
matrix.emplace_back(vector<int>{1, 2, 3});
构造两个向量。中的空向量matrix
,以及过去的临时。临时值被移动到空向量中。所以这真的没那么糟糕。
然而,这:
matrix.emplace_back(initializer_list<int>{1, 2, 3});
使用接受初始值设定项列表的构造函数仅构造一个向量。请注意,没有“额外”initializer_list
此处创建的对象。当使用花括号初始化创建任何向量时,无论如何都会创建这样的对象:
vector<int> vec{1, 2, 3};
这也创建了一个initializer_list
对象,因为这就是向量构造函数所采用的。
至于为什么emplace_back(2,3)
有效,那是因为有一个向量构造函数需要一个大小和一个值。