я наткнулся на код, как это от C++ reference page:Как можно построить std :: vector конструктивных объектов, не являющихся стандартными?
#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 (-4) ',' std: : reference (-3) ', etc ... –
@Robl: Да, вы можете добавить к нему, используя любой метод, который не требует конструктора по умолчанию. –