繁体   English   中英

保留reference_wrapper对象的向量,它是如何可能的?

[英]Reserve a vector of reference_wrapper objects, how it is possible?

std::reference_wrapper不是默认构造的。 所以我不能写任何:

std::vector<std::reference_wrapper<int>> vec(10);
std::array<std::reference_wrapper<int>, 3> arr;

但是,令我惊讶的是,您可以调用std::reference_wrapper对象向量的std::vector::reserve成员函数,并有效地更改其容量。

std::vector<std::reference_wrapper<int>> vec;  
vec.reserve(10);

现场演示

这怎么可能,因为std::reference_wrapper没有默认构造函数?

reserve仅分配未初始化的内存块足以适应N单元而不会在推送N新元素时导致重新分配。

reserve不会构建任何新元素。 最坏的情况是它只移动/复制已经创建的那些。

您可以参考SGI STL实现

在stl_vector.h中:

void reserve(size_type __n) {
    if (capacity() < __n) {
      const size_type __old_size = size();
      iterator __tmp = _M_allocate_and_copy(__n, _M_start, _M_finish);
      destroy(_M_start, _M_finish);
      _M_deallocate(_M_start, _M_end_of_storage - _M_start);
      _M_start = __tmp;
      _M_finish = __tmp + __old_size;
      _M_end_of_storage = _M_start + __n;
    }
  }

void resize(size_type __new_size) { resize(__new_size, _Tp()); }

reserve不会创建新元素,但resize会创建。

vector::reserve(N)只是为N元素预先分配存储容量。 您正在使用的向量构造函数是“默认填充”构造函数 - 它创建 N默认构造函数元素并将它们插入到容器中。

例如

vector<T> v;
v.reserve(N);
assert(0 == v.size());
assert(N >= v.capacity());

VS

vector<T> v(N);
assert(N == v.size());
assert(N >= v.capacity());

根据C ++ 17工作草案的23.3.6.3.p2 [vector.capacity], vector::reserve()只要求TMoveInsertable*this 有问题的构造函数在23.3.6.2.p3 [vector.cons]中指定,并要求TDefaultInsertable*this

reference_wrapper<>MoveInsertable但不是DefaultInsertable (它不能像你提到的那样是默认构造的)。 有关这些概念的确切定义,请参见23.2.1.p15 [containers.requirements.general]。

暂无
暂无

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

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