私はベクトルのGCCの実装を確認し、それが読み:アロケータの情報が消えないようなので、
vector(size_type __n, const value_type& __value,
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{ _M_fill_initialize(__n, __value); }
...
_M_fill_initialize(size_type __n, const value_type& __value)
{
this->_M_impl._M_finish =
std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
_M_get_Tp_allocator());
}
を、それが見えます。しかし、uninitialized_fill_n_a
のコードは2つのオーバーロード(下を参照)を持っています.1つは汎用アロケータ用、もう1つはstd::allocator
です。
construct
とstd::allocator
の特殊コールは、単にstd::uninitialized_fill()
を呼び出します。
だから、私の結論は、一般的なアロケータのために仮定することはできません以下、
1)すべてのstd::allocator
のconstruct
sが新しい配置と
2と同じ効果を持っている)、または少なくともGCCですstd::vector
はそれを想定していません。 (@Michael Burrによれば、C++ 03でこれを仮定できますが、残念ながらC++ 11は言及していません)。
したがって、使用構成(std::allocator_traits<Alloc>::construct(alloc, pointer, value)
)です。
私の個人的な意見は、(これを調査した後)、
I)std::uninitialized_fill
はそれはアロケータとの最後のオプションの引数(または他の過負荷)、
II)などを取るべきで、不良品であるということです回避策として、実装の詳細の中に例外を処理することを含む.uninitialized_fill(first, last, value, alloc)
関数を持たなければなりません(以下の例では、失敗時に構造がどのように破棄されるかを示しています)。
あなたはアロケータについての情報を持っている(と基本的にあなたがそれを再実装する必要がある場合ⅲ)現在std::unitialized_fill
はかなり無駄です)
今の上で参照コード:
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Allocator>
_ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Tp2>
inline _ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, allocator<_Tp2>&)
{ return std::uninitialized_fill_n(__first, __n, __x); }
'stdの何:: initialize_fill() '? 'std :: uninitialized_fill()'を意味しますか? 'initialize_fill()'関数は、 'uninitialized_fill()'とは異なり、C++標準のどこにも現れません。 –
@Insilico申し訳ありませんが、それはタイプミスでした。ありがとうございました。私はその問題を解決した。 – Martin
これは私の質問に関連しているようです:http://stackoverflow.com/questions/9727556/is-uninitialized-copy-fillin-first-in-last-for-dest-aa-an-oversight-inth実際には普通の 'uninitialized_fill'を使うのが安全だろうと考えています –