C++ 分配器构造()是否应该进行默认初始化而不是值初始化?

C++ 分配器构造()是否应该进行默认初始化而不是值初始化?,c++,c++11,vector,language-lawyer,allocator,C++,C++11,Vector,Language Lawyer,Allocator,作为后续操作,需要使用默认分配器(std::allocator)来实现construct,如下所示(根据[default.allocator]): 在调用情况下,是否有理由选择值初始化?这似乎让我感到惊讶,这打破了通常的C++规则,我们只为我们想要使用的东西付费。p> †鉴于目前std::vector v(100)将为您提供1000s,我认为未来不可能进行此类更改,但我想知道为什么会出现这种情况。。。考虑到人们可能同样容易地需要std::vector v2(100,0),就像newint[10

作为后续操作,需要使用默认分配器(
std::allocator
)来实现
construct
,如下所示(根据[default.allocator]):

在调用情况下,是否有理由选择值初始化?这似乎让我感到惊讶,这打破了通常的C++规则,我们只为我们想要使用的东西付费。p>

†鉴于目前
std::vector v(100)
将为您提供100
0
s,我认为未来不可能进行此类更改,但我想知道为什么会出现这种情况。。。考虑到人们可能同样容易地需要
std::vector v2(100,0)
,就像
newint[100]
newint[100]{}
之间存在差异一样

在C++03分配器
构造中
成员有两个参数:指针和值,用于执行复制初始化:

20.1.6表34

a.construct(p,t)

效果:
::新((void*)p)T(T)

构造
可采用两个参数(第18页)。正如您所看到的,在最初的Stepanov概念中,它不是分配器接口的一部分(它不应该是可配置的),并且作为包装器出现在新的位置上

唯一确定答案的方法是问斯捷潘诺夫本人,但我想原因如下:若你们想构造一些东西,你们想用特定的值初始化它。如果您不想初始化整数,您可以省略
construct
调用,因为POD类型不需要它。后来,
construct
和其他相关函数被捆绑到分配器中,容器在分配器上被参数化,从而导致最终用户对初始化失去控制


<> P>这似乎是缺省初始化的历史原因:没有人知道它的重要性,当C++被标准化,以后版本的标准不会引入突破性改变。

参见最近采用的。它只是将算法添加到标准库中,对吗?对。所以这不是一个答案,只是一个评论。它提供了方便的界面,简化了解决方案的实施。顺便说一下,类似于
使_独一无二
的问题。
template <class U, class... Args>
void construct(U* p, Args&&... args);
template <class U>
void construct(U* p) noexcept(std::is_nothrow_default_constructible<U>::value)
{
    ::new(static_cast<void*>(p)) U;
}