Глядя на стандарт raw_storage_iterator
, для typedef value_type
значение не равно T
, но вместо этого void
:
template <class OutputIterator, class T>
class raw_storage_iterator
: public iterator<output_iterator_tag,void,void,void,void>
^^^^
, тогда как uninitialized_copy
должен использовать этот typedef:
template <class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
ForwardIterator result);
Эффекты:
for (; first != last; ++result, ++first)
::new (static_cast<void*>(&*result))
typename iterator_traits<ForwardIterator>::value_type(*first);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
В вашем коде после всех подстановок это приводит к:
new (...&*result) void (*first);
^^^^^^^^^^^^^
invalid use here
Из этого вы можете сделать вывод, что эти два значения никогда не предназначалисьработать вместе.
Если вы хотите использовать raw_storage_iterator
, тогда должно быть хорошо передать его на std::copy
, поскольку вся магия происходит при перегрузке operator=(const T&)
.
Есливы думаете, что все это необходимо для примитива типа char
, где вы можете просто выделить с помощью new char[x]
(NB! завершение NUL) и скопировать с помощью strcpy
.