странные конструкторы копирования - PullRequest
4 голосов
/ 12 августа 2011

следующие 2 из конструкторов слабых_птров: http://msdn.microsoft.com/en-us/library/bb982126.aspx

weak_ptr(const weak_ptr&);

template<class Other>
weak_ptr(const weak_ptr<Other>&);

фактический код (из memory):

weak_ptr(const weak_ptr& _Other)
{   // construct weak_ptr object for resource pointed to by _Other
    this->_Resetw(_Other);
}

template<class _Ty2>
weak_ptr(const weak_ptr<_Ty2>& _Other,
         typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
         void *>::type * = 0)
{   // construct weak_ptr object for resource pointed to by _Other
    this->_Resetw(_Other);
}

Q1: Почему конструктор верхнего копирования дажетам?Похоже, что нижний счет для каждого случая (включая верхний).Это даже называют?и если бы они не включили его, занял бы его нижний?

Q2: Что происходит со вторым аргументом нижнего (шаблонного) конструктора.Я думаю, что понимаю аспект SFINAE, но я не понимаю, почему после ::type

возникает дополнительный *

Ответы [ 2 ]

5 голосов
/ 12 августа 2011

Q1) Если вы не пишете конструктор копирования, компилятор сгенерирует его для вас, что не будет тем, что вы хотите. Шаблонные конструкторы преобразования не учитываются.

Q2) Помните, что shared_ptr<T> походит на T*, конвертируемость должна проверяться на уровне указателей. Если T* можно преобразовать в U*, то вы сможете назначить одно другому. Подумайте о указателях на базу. [Извините, это не то, что вы просили.] Конечный тип аргумента просто должен существовать, но мы также не хотим указывать сам аргумент. Универсальным способом создания типа, для которого мы также можем предоставить аргумент по умолчанию, является указатель. Короче говоря, мы должны сделать функцию зависимой от типа, который может существовать или не существовать, но на самом деле не требуется, чтобы пользователь знал об этом.

4 голосов
/ 12 августа 2011

Re Q1: шаблонный конструктор никогда не является «конструктором копирования», даже если ему удается скопировать.если пользовательский «конструктор копирования» отсутствует, то компилятор сгенерирует его по мере необходимости.

Re Q2: второй аргумент, указатель по умолчанию равен 0, просто должен иметь место для размещения enable_if.Вы можете найти больше об этом (если я правильно помню) в документации Boost.

Cheers & hth.,

...