Ссылка на константу unique_ptr в C++
-
23-12-2019 - |
Вопрос
Я пытаюсь перенести решение, использующее указатели, на решение, использующее unique_ptr, чтобы упростить обработку ресурсов.Я осведомлен о семантике перемещения и использовании std::move()
для работы с unique_ptr.
В настоящее время у меня есть функция с подписью int foo(const T2DMatrix* m)
и я вызываю это, используя динамически выделяемый объект 2D-Matrix.Функция foo
требуется доступ только для чтения к классу T2DMatrix, отсюда и аргумент const.Теперь я перенес это в int foo(unique_ptr<const T2DMatrix>& m)
.Из другой функции, process()
, который имеет unique_ptr<T2DMatrix>
объекта (созданного с использованием фабричной функции), я хочу передать объект в foo в качестве параметра.Однако компилятор не позволяет мне этого сделать.Обратите внимание: я не хочу передавать право собственности на объект из process()
к foo()
, отсюда и использование ссылок.Вызов foo() с unique_ptr<const T2DMatrix>
работает нормально, однако гарантия const не будет применяться, если я изменю сигнатуру функции.
Примечание:одно решение, которое я нашел, - это создать новый unique_ptr<const T2DMatrix>
объект в процессе(), передаем на него право собственности от оригинала unique_ptr<T2DMatrix>
объект с использованием std::move()
, передайте его в foo() и снова передайте право собственности в процесс().Но это вряд ли кажется идеальным решением.
Пожалуйста, предложите эквивалент решения указателя, которое позволяло мне передавать аргумент T2DMatrix* в параметр const T2DMatrix*.Я пробовал использовать msvc2012, msvc2013 и g++4.8, все с теми же результатами.
Решение
Если функция не требует владения, передайте простую ссылку вместо ссылки на unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
Не нужно искусственно ограничивать foo
к unique_ptr
s, если функция все равно не заботится о владельце.