是 new(&*p) double;一个空操作。因此 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) 将对非平凡类型做什么。还会调用默认构造函数吗?如果 class 被设计成这样,它是否也是空操作只要 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{})
.
模仿
是不是STL的初始版本没有uninitialized_default_construct
的概念?或者只是没有简单的方法将信息传递给容器的构造函数?
What also confuses me is why the STL containers will always use uninitialized_value_construct
although it would have been more consistent to call uninitialized_default_construct
when possible.
容器两者都不用。容器通过它们的分配器构造对象。不幸的是,allocator_traits<...>::construct
采用了一系列任意参数。不传递参数在默认初始化和值初始化之间是不明确的。使用哪一个取决于分配器,但无法通过参数列表 select 指定哪一个。默认 allocator_traits::construct
将使用值初始化,并且它将始终对所有类型这样做。
the current behavior could have been mimicked with std::vector<double>(100, {})
即使忽略向后兼容性问题以及我刚才所说的关于分配器的内容,该构造函数也意味着 "default construct a double
and then copy that double
's value into 100 elements one at a time." 所以它不会是 "the current behavior"。
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) 将对非平凡类型做什么。还会调用默认构造函数吗?如果 class 被设计成这样,它是否也是空操作只要 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{})
.
是不是STL的初始版本没有uninitialized_default_construct
的概念?或者只是没有简单的方法将信息传递给容器的构造函数?
What also confuses me is why the STL containers will always use
uninitialized_value_construct
although it would have been more consistent to calluninitialized_default_construct
when possible.
容器两者都不用。容器通过它们的分配器构造对象。不幸的是,allocator_traits<...>::construct
采用了一系列任意参数。不传递参数在默认初始化和值初始化之间是不明确的。使用哪一个取决于分配器,但无法通过参数列表 select 指定哪一个。默认 allocator_traits::construct
将使用值初始化,并且它将始终对所有类型这样做。
the current behavior could have been mimicked with
std::vector<double>(100, {})
即使忽略向后兼容性问题以及我刚才所说的关于分配器的内容,该构造函数也意味着 "default construct a double
and then copy that double
's value into 100 elements one at a time." 所以它不会是 "the current behavior"。