是新的(&*p)双倍;一个无操作。因此,uninitialized_default_construct是否也变得无操作?
Is new(&*p) double; a no-op. Does therefore uninitialized_default_construct becomes no-op as well?
STL 文档说 (1(uninitialized_default_construct
调用::new (static_cast<void*>(std::addressof(*p))) Value;
.
与 (2(uninitialized_value_construct
的唯一区别是后面的调用::new (static_cast<void*>(std::addressof(*p))) Value();
。(注意()
(
我想知道内置类型和非平凡类型的实际区别是什么。
对于内置函数,在我看来,第二个 (2( 将进行值初始化,即将值设置为零,而第一个 (1( 将是无操作(使值未初始化(。
对于非平凡类型(2(将调用默认构造函数。我不清楚的是(1(对非平凡类型的作用。还会调用默认构造函数吗?如果类被设计为这样,它是否也是T::T() = default
并且它是无操作的,并使元素处于部分形成状态?
同样让我感到困惑的是,为什么 STL 容器总是使用uninitialized_value_construct
尽管在可能的情况下调用uninitialized_default_construct
会更一致。
例如std::vector<double>(100)
-> 应该调用uninitialized_default_construct
,而当前行为可以用std::vector<double>(100, {})
或std::vector<double>(100, double{})
来模仿。
这是因为uninitialized_default_construct
的概念在STL的初始版本中不存在吗? 或者只是没有简单的方法将信息传递给容器的构造函数?
同样让我感到困惑的是,为什么 STL 容器总是使用
uninitialized_value_construct
,尽管在可能的情况下调用uninitialized_default_construct
会更一致。
容器不使用这两种方法。容器通过其分配器构造对象。不幸的是,allocator_traits<...>::construct
采用任意一系列参数。不传递任何参数在默认初始化和值初始化之间是不明确的。使用哪一个取决于分配器,但无法通过参数列表选择哪一个。默认allocator_traits::construct
将使用值初始化,并且始终对所有类型执行此操作。
当前的行为本可以用
std::vector<double>(100, {})
来模仿
即使忽略向后兼容性问题以及我刚刚说的关于分配器的内容,该构造函数也意味着"默认构造一个double
,然后将该double
的值一次复制到 100 个元素中。所以它不会是"当前的行为"。
- 在提升multi_index容器中,是否定义了"default index"?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?