c++11
随着新标准的增加,分配器类型的对象被赋予了功能。
添加的功能之一是分配器现在允许进行安装,也就是。使用复制/移动以外的构造函数构造对象。
template< class U, class... Args > void construct( U* p, Args&&... args );
该标准确实保证 STL 容器必须使用这个新特性,并且说您可以实现自己的分配器,只是为了默认初始化一个不可默认初始化的对象。
这不是最漂亮的解决方案,但无论你的船漂浮什么......
c++03
分配器与对象初始化的那部分无关,它的唯一目的是分配/释放内存,您所指的初始化类型在其他地方完成。
分配器将调用的唯一构造函数是复制构造函数,当有人要求它执行放置新时,传递给该复制构造函数的值已经在其他地方建立。
总结一下;不,您不能使用分配器来解决这个特定问题。
std::vector 何时需要使用default-ctor?
std::vector
仅在两种情况下使用它所拥有的类型的默认构造函数:
您std::vector
在适当的构造函数重载中指定元素的数量,但不提供默认值
您使用std::vector<T>::resize (n)
并增加容器中的对象数量(请注意缺少指定成员函数的第二个参数)
考虑到上述内容,我们可以使用容器做很多事情,而无需在我们的对象中提供默认构造函数,例如将其初始化为包含N个值为X的元素。
struct A{
A (A const& a)
: value_ (a.value_)
{ }
A (int value)
: value_ (value)
{}
int value_;
};
int
main (int argc, char *argv[])
{
std::vector<A> vec (5, A(1)); // initialize vector with 5 elements of A(1)
vec.push_back (A(3)); // add another element
}
但我真的希望能够使用vec.resize()!?
然后你有两个、三个、四个选项:
使用使用分配器的C++11方法
使您的对象具有默认构造函数
用一个非常薄的包装器包装您的对象,其唯一目的是默认初始化包含对象(在某些情况下这可能更容易说然后做)
“在 boost::optional 中包装 [对象] 实际上为任何类型提供了默认 ctor” - @ Xeo