繁体   English   中英

emplace_back()不能在向量向量上的支撑初始化器

[英]Cannot emplace_back() a braced initializer on a vector of vectors

这与我之前提出的关于在对矢量上使用emplace_back问题有些相关。 将一对插入std :: vector时,emplace_back()vs push_back

现在我的问题涉及在向量向量上使用emplace_back

以下是我对评论提出质疑的代码

std::vector<std::vector<int>> matrix;

matrix.emplace_back({1,2,3}); //doesn't compile

matrix.emplace_back(1,2,3); //doesn't compile

matrix.push_back({1,2,3}); //works and does what is expected (insert a vector made of {1,2,3} into matrix);

matrix.emplace_back(std::vector<int>{1,2,3});   //works but 
//defeats the purpose of using emplace_back since this makes a copy
//and is thus equivalent to push_back in this case?

matrix.emplace_back(3,2) //this compiles, 
//but it seems to insert a vector of size 3 made of 2s into the matrix. 
//not actually sure why it does this

所以,由此, matrix.emplace_back(std::vector<int>{1,2,3}); 似乎是在std::vector<T>::emplace_back上使用std::vector<T>::emplace_back的唯一正确方法,但这似乎没有提供优于push_back优势。 我对此事的理解是否正确?

另外,有人可以解释为什么matrix.emplace_back(3,2) 2s组成的大小为3的向量插入到矩阵中吗?

在这种情况下{1, 2, 3}不能推导到initializer_list<int> (这是你想要使用的vector<int>构造函数所期望的。)所以你需要帮助它:

matrix.emplace_back(initializer_list<int>{1, 2, 3});

使用push_back()时不需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的构造函数构造一个向量。 请注意,此处没有创建“额外” initializer_list对象。 使用支撑初始化创建任何向量时,无论如何都会创建这样的对象:

vector<int> vec{1, 2, 3};

这也会创建一个initializer_list对象,因为这就是向量构造函数所采用的对象。

至于为什么emplace_back(2,3)有效,那是因为有一个矢量构造函数需要一个大小和一个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM