Я хочу передать unique_ptr
вспомогательной функции, и я хочу убедиться, что вспомогательная функция не изменяет указатель и не заостренный объект. Без unique_ptr
решение должно иметь
void takePtr(AClass const * const aPtr) {
// Do something with *aPtr.
// We cannot change aPtr, not *aPtr.
}
(Ну, технически, AClass const * aPtr
достаточно.) И я могу назвать это с помощью
AClass * aPtr2 = new AClass(3);
takePtr(aPtr2);
Я хочу вместо этого использовать unique_ptr
, но не могу понять, как это записать. Я попробовал
void takeUniquePtr(unique_ptr<AClass const> const & aPtr) {
// Access *aPtr, but should not be able to change aPtr, or *aPtr.
}
Когда я вызываю это с помощью
unique_ptr<AClass> aPtr(new AClass(3));
takeUniquePtr(aPtr);
он не компилируется. Ошибка, которую я вижу, это
testcpp/hello_world.cpp:141:21: error: invalid user-defined conversion from ‘std::unique_ptr<AClass>’ to ‘const std::unique_ptr<const AClass>&’ [-fpermissive]
Не следует ли автоматическое преобразование из unique_ptr<AClass>
в unique_ptr<AClass const>
? Что мне здесь не хватает?
Кстати, если я изменяю unique_ptr<AClass const> const & aPtr
на unique_ptr<AClass> const & aPtr
в определении функции, он компилируется, но затем я могу вызывать функции типа aPtr->changeAClass()
, которые я не хочу разрешать.