Мотивация:
Я пытаюсь перевести std::vector<std::unique_ptr<some_type>>
в другой поток через лямбда-захват.
Так как мне нужно, чтобы вектор не очищался при выполнении функциивыходит за рамки видимости, мне нужно взять его по значению (а не по ссылке).
Поскольку это вектор unique_ptrs, мне нужно переместить (а не скопировать) его в захват.
Я использую обобщенный лямбда-захват для перемещения вектора во время захвата.
Минимальная программа для иллюстрации концепции:
auto create_vector(){
std::vector<std::unique_ptr<int>> new_vector{};
new_vector.push_back(std::make_unique<int>(5));
return std::move(new_vector);
}
int main() {
const auto vec_const = create_vector();
[vec=std::move(vec_const)](){
std::cout << "lambda, vec size: " << vec.size() << std::endl;
}();
}
Проблема:
Если я использую const
локальный вектор, компиляция завершится неудачно из-за попытки скопировать unique_ptr
s.Однако, если я удаляю квалификатор const
, код компилируется и работает хорошо.
auto vec_const = create_vector();
Вопросы:
В чем причина этого?Является ли const отключением «подвижности» вектора?Почему?
Как мне обеспечить константность вектора в таком сценарии?
Последующие действия:
В комментариях и ответах упоминается, что константный тип не можетбыть перемещен из.Звучит разумно, однако ошибки компилятора не дают понять.В этом случае я ожидал бы одну из двух вещей:
-
std::move(vec_const)
должен выдать ошибку о невозможности перехода из const (приведение его к rvalue). - Перемещение вектора-строитель говорит мне, что он отказывается принимать постоянные значения.
Почему этого не происходит?Почему вместо этого назначение, кажется, просто пытается скопировать unique_ptrs внутри вектора (что я и ожидал от конструктора копирования векторов)?