Вы можете построить новый вектор, перемещая содержимое старого вектора в него:
#include <iterator>
#include <memory>
#include <vector>
std::vector<std::unique_ptr<T>> v; // ...
std::vector<std::unique_ptr<const T>> cv(
std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()));
reinterpret_cast
Ваши предложенные результаты в неопределенном поведении.
Общая тема вашего вопроса заключается в том, что вы пытаетесь найти обработчик управления ресурсами для одной вещи, как если бы это было для другого, связанного с этим. Это проблематичное понятие, поскольку обработчик действительно должен знать, что именно он обрабатывает, и он не имеет смысла. То, что вы действительно хотите сделать, это сообщить вид на , обработанный. В текущем контексте вы можете взять обработанную вещь, указатель T
и преобразовать в в указатель const T
, используя обычные правила языка, которые работают как ожидалось и избегают говорить об объекте обработчика (уникальный указатель).
Выполняет ли это просто 'return {some.begin(), some.end()}'? –
@BenVoigt: уникальные указатели не могут быть скопированы. –
@ Kerrek: Ах, да. вам понадобится адаптер move-iterator. Тем не менее, перемещение всего существующего 'unique_ptr' в 'unique_ptr ' в новом векторе является правильным подходом, так как 'reinterpret_cast' является UB. –