Вопрос

Я пытаюсь перенести решение, использующее указатели, на решение, использующее 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_ptrs, если функция все равно не заботится о владельце.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top