如何构造非默认可构造对象的std::向量
How is it possible to construct a std::vector of non-default constructible objects?
我在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
初始化操作系统新提供给您的内存块呢?
这听起来可能是一个令人困惑的问题,但由于某种原因,我无法完全理解上面代码中发生了什么。里面发生了什么事?
它之所以有效,是因为那里没有默认的初始化-列表中的元素用于复制初始化向量。
例如,以下方法不起作用:
std::vector<std::reference_wrapper<int>> v(42);
std::vector<>
的构造函数首先获得一个适当大小的原始内存块(使用其allocator
)。然后它构造对象。在这里的特定构造函数的情况下
template<typename It>
std::vector::vector(It begin, It end);
它从迭代器的valuetype构造元素,因此每个reference_wrapper<int>
都是从int
构造的(就地)。
向量中的所有对象都是使用一个带int的单参数构造函数构建的。因此,在语义上不需要默认构造函数。
就实现而言,可以通过用malloc
而不是new
来分配内存(因此没有调用构造函数),然后在向向量添加元素时使用放置new
来实现这种行为。
相关文章:
- 将对象移动到std::shared_ptr
- 使用std::函数映射对象方法
- 使用"std::unordereded_map"映射到"std::list"对象
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 如何使用std::min和std::less返回对象
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- C++11 中不同类型的对象的 std::array 的替代方案
- 返回一个带有 std::move 的对象并链接函数
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- std::string 的对象真的可以移动吗?
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 即发即弃 std::线程对象清理自身
- 为什么当对象std ::向量被声明但从未使用时,编译器不会发出警告
- C++是保证在基本对象std::swap之后有效的派生对象数据
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 为什么我得到这个奇怪的错误时,试图添加一个重复的对象std::set
- 查找投掷对象 std::out_of_range
- 对象 std::shared_ptr 是否可以通过其 std::weak_ptr 找到