2017-02-09 4 views
3

Я учусь std::shared_ptr.
Я прочитал документ о конструкторах shared_ptr, чтобы найти его конструктор копирования.Есть ли std :: shared_ptr <X> имеет конструктор копирования?

я мог бы найти конструктор,

shared_ptr(const shared_ptr& r); 

но мне кажется, что это не просто конструктор копирования я ожидал,

shared_ptr(shared_ptr& r); 

и, кажется, он не разделяет счетчик ссылок.

Почему shared_ptr не имеет простого конструктора копирования?

В случае, если я пишу то, что я действительно хочу сделать ниже,

class A { 
public: 
    A(shared_ptr<X>& sptr) : sptr_(sptr) {} 
private: 
    shared_ptr<X> sptr_; 
}; 
+2

Конструкторы копирования * обычно * имеют 'const' часть (потому что она не должна изменять переданный объект), но она не нужна. –

+0

Вы ожидаете неправильного. Конструктор копирования в C++ обычно принимает ссылку * constant * (следовательно, 'const'), поскольку он не должен изменять копируемую вещь. – filmor

+0

@filmor: спасибо за комментарий. Эта копия увеличивает счетчик ссылок исходного экземпляра shared_ptr? – mora

ответ

4

Почему shared_ptr не имеет простой конструктор копирования?

Стандарт говорит, что:

Конструктор без шаблона для класса X является конструктором копирования, если его первый параметр имеет типа X &, сопзИте X &, летучий X & или Const летучего X &, [...]

Там нет ничего такого простой конструктор копирования а. std::shared_ptr имеет совершенно правильный конструктор копирования. Он создает объект std::shared_­ptr, который имеет право собственности на данный объект (если он действителен).

+1

спасибо, что ответили мне. – mora

+0

@mora Добро пожаловать. – skypjack

Смежные вопросы