вызов функции с общим указателем, чей объект должен быть постоянным - PullRequest
0 голосов
/ 25 октября 2018

У меня есть переменная a, тип которой A.

A a;

Я хочу вызвать функцию, которая принимает константную ссылку типа A в качестве входного аргумента.

fun(const A &a);

После некоторых изменений кода я решил, что лучше всего изменить тип переменной a на std::shared_ptr<A>

std::shared_ptr<A> a;

Какой лучший способ изменить функцию fun чтобы я удостоверился, что объект a никогда не изменяется (он должен оставаться постоянным)?

должен fun остаться таким, как есть, и я должен назвать его так:

fun(*a.get())

или есть какая-нибудь альтернатива?Каким-то образом это кажется мне уродливым ...

Я думаю, простое изменение fun на fun(const std::shared_ptr<A> &a) не сработает, потому что я хочу убедиться, что функция не меняет базовый объект, а не разделяемый указатель.

Я не могу использовать std::shared_ptr<const A> a, потому что в какой-то момент необходимо изменить переменную a.

1 Ответ

0 голосов
/ 25 октября 2018

Поскольку void fun(const A& a);, по-видимому, не влияет на время жизни аргумента, оставьте сигнатуру такой, какая она есть сейчас (передача std::shared_ptr или std::unique_ptr в качестве аргумента функции всегда предполагает эти значения времени жизни).Назовите это так:

auto a = std::make_shared<A>();

fun(*a);

Таким образом, вы можете обойти многословный *a.get() и напрямую использовать оператор разыменования , предоставленный std::shared_ptr.

...