[英]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.