【发布时间】:2020-03-18 00:24:25
【问题描述】:
我想自定义 std::vector 行为以不默认构造元素类型(例如 int),因为这样做对于大型向量来说很昂贵。
看着这个,我能看到的唯一方法是专门化std::allocator_traits<MyAllocator>::construct。但是,这似乎是不可能的,因为特化必须与原始声明在同一个命名空间中。
在namespace std 中设置专业化似乎并不正确。而且实际上比这更糟糕,因为我使用的 STL 实现实际上将 std::allocator_traits 放在了 namespace std::__u 中(而且这肯定会因 STL 实现而异),所以这样做似乎是非常错误的。
这令人困惑,因为似乎 std::allocator_traits 旨在允许专业化,但我无法弄清楚如何实际做到这一点。这只是一个坏主意吗?如果是这样,是否有其他方法可以解决问题(避免在 STL 容器中默认构造元素)?
【问题讨论】:
-
int的默认初始值设定项是什么都不做,但大多数vector重载实际上执行“零”初始化。 stackoverflow.com/questions/29765961/… -
为什么要构造大量没有价值的
int? -
实际上,鼓励使用专门的标准库模板(除非另有说明);另一方面,重载标准库函数是未定义的行为。
-
@MooingDuck 我会说任何合规的植入都会正确初始化
vector中的数据。在 90 年代实现 C++ 98 或 03 标准之前,可能会找到未正确初始化数据的编译器... -
@Phil1970:我想你误会我了。 “零”初始化是一种特殊形式的初始化,其中 C++ 将使用
0值初始化基元,并默认构造类。 Wheras“默认”初始化将默认构造类,但不会使用任何特定值初始化原语,因此从它们读取将是未定义的行为。请参阅我附加的链接。