Нет, если вы используете возвращаемое значение.Само возвращаемое значение является временным, время жизни которого выходит за пределы конца функции;оно будет уничтожено в конце полного выражения, которое вызывает A::clone_a
.Поэтому, если вы напишите что-то вроде:
shared_ptr<int> newA = object->clone_a();
, формальная семантика будет для временного значения, возвращаемого object->clone_a()
, которое будет скопировано в newA
в контексте вызывающей стороны (и поэтому незащищеномьютекс).В этом конкретном случае вам может это сойти с рук из-за RVO, но это не обязательно так, и есть другие случаи, когда RVO не может вмешиваться.
Если все, что вас беспокоит, это копия указателя, я вполне уверен, что если вы установите правильные параметры компилятора (-D
<i>somthing</i>
), boost::shared_ptr
будет вести себя атомарно.В этом случае вам вообще не нужен мьютекс.