std::shared_ptr<const int>
отличается от типа std::shared_ptr<int>
, но существует неявный конструктор преобразования.
Когда вы звоните foo2(b)
, временный std::shared_ptr<const int>
создается из b
и связывается с p
. Конструктор увеличивает счетчик ссылок, а деструктор уменьшает его.
Когда вы вызываете foo1(a)
, a
копируется в p
. p
существует на время вызова, а затем уничтожается. Конструктор увеличивает счетчик ссылок, а деструктор уменьшает его.
Когда вы вызываете foo2(a)
, a
привязывается к p
. Временные данные не создаются, поэтому счетчик ссылок не изменяется.
Обратите внимание, что в вашем примере нет счетчика ссылок, так как ни 1022 * s, ни const int
s не указаны ни одним из указатели.