std::shared_ptr
«принимающий указатель» конструктор объявляется explicit
.
template< class Y >
explicit shared_ptr(Y* ptr);
При том, что вы не можете использовать инициализацию копирования (shared_ptr<parent> p2 = new parent;
).
Лучшая причина, по которой я могу думать, почему std::shared_ptr
«s конструктор сделан explicit
, что вы меньше шансов сделать ошибки прохождения сырой, неуправляемые по std::shared_ptr
объекта к функции, получающей std::shared_ptr
.
#include <memory>
void func(std::shared_ptr<int> ptr) { /* ... */}
int main() {
auto iptr = std::make_shared<int>();
func(iptr); // OK
/*
int* iptr = new int;
func(iptr); // Unclear who would eventually manage (delete) the pointer
// ...
delete iptr; // Undefined behavior!
*/
}
Если конструктор не был сделан explicit
, то вы могли бы сделать закомментированный код.
Кроме того, как то, что @R. Martinho Fernandes имеет suggested, у вас может возникнуть проблема, если передаются указатели не new
.
int myint;
int* iptr = &myint;
func(iptr); // iptr doesn't point to a newed (dynamically-allocated) object
// std::shared_ptr, by default, uses delete on its managed pointer
// if there are no more references to that pointer
Тем не менее вы можете сделать это не так, если вы не будете осторожны, когда вы используете два отдельных std::shared_ptr
с для управления сырой указатель.
int* riptr = new int;
std::shared_ptr<int> iptr(riptr);
std::shared_ptr<int> iptr2(riptr); // WRONG!
С вашими вопросами о сырых указателей, то две, по существу, то же самое, но это не обязательно относится к std::shared_ptr
.
Возможный дубликат [Отсутствует уникальный \ _ptr и оператор друзей = перегрузка] (http://stackoverflow.com/questions/14916931/missing-unique-ptr-and-friends-operator-overload) – user1233963