我在C++参考页面上看到了这样的代码:
#include <algorithm>
#include <list>
#include <vector>
#include <functional>
int main()
{
std::list<int> l = {-4, -3, -2, -1, 0, 1, 2, 3, 4};
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
return 0;
}
这是“示例”部分的代码片段。代码按预期编译和运行。但是,这是怎么可能的呢?
std::reference_wrapper<int>
不能被默认构造。你怎么能使一个 std::vector
包含这些东西?我一直将 std::vector
想象成动态数组。但你如何从 std::list
初始化一个刚从操作系统给出的一块内存块?这可能听起来很困惑,但由于某种原因,我无法完全理解上面的代码。那里发生了什么?
l
中每个元素的非默认构造函数,例如std::reference<int>(-4)
,std::reference<int>(-3)
等。 - Rob Iemplace_back
? - balkiemplace
、insert
、push_back
或者resize
(带有两个参数的版本)。事实上,唯一需要默认构造函数的向量方法是单参数版本的resize
,以及只接受 int 参数进行初始大小设置(或 int 和分配器)的构造函数。 - Benjamin Lindley