【发布时间】:2021-03-03 09:31:24
【问题描述】:
给定简单的代码
#include <array>
#include <vector>
int main() {
std::vector<std::array<int,3>> v;
v.emplace_back(std::array<int,3>{1,2,3});
}
我首先担心到底发生了什么。
我对 emplace_back 的理解是,它通过将其参数转发到该元素的构造函数。
但是哪个构造函数?由于我们传递的是与我们想要放置的元素类型相同的对象,我猜想选择了移动构造函数,因为我们传递的是临时的,或者如果移动 ctor 被删除(隐式或显式),则传递复制 ctor。此外,我们首先是在构建那个临时的,而这没有就地完成,对吧?
所以我们基本上是通过将1、2 和3 作为参数传递给std::array<int,3> 的“普通”(???) 构造函数,从而取回一个临时的,它被传递到std::array<int,3> 的复制ctor,它在适当的位置构造副本,或者最好是到std::array<int,3> 的移动ctor,它(?)复制底层C 样式指针?
应该清楚这个简单的例子让我很困惑。
更让我困惑的是,如果我真的想利用emplace_back,我只能将std::array<int,3> 的参数传递给它,如
#include <array>
#include <vector>
int main() {
std::vector<std::array<int,3>> v;
v.emplace_back(1,2,3);
}
【问题讨论】:
-
std::array没有用户定义的构造函数。它使用聚合初始化。 -
stackoverflow.com/q/43394841/103167 的副本(另一个问题中的“结构”和您的
std::array都是需要聚合初始化的聚合)。
标签: c++ c++11 stdarray emplace