2016-05-27 6 views
3

Рассмотрение следующего кода. Почему я не могу использовать обозначение назначения здесь, почему это считается неявным преобразованием.Обозначение присвоения shared_ptr неявное преобразование

shared_ptr<string> pNico = new string("nico"); // ERROR implicit conversion 
shared_ptr<string> pNico{new string("nico")}; // OK 
+0

Возможно, что построение из необработанного указателя сделано явно для 'shared_ptr', так что' foo (&obj); 'не будет случайно владеть' obj' –

+0

Оператор присваивания не перегружен для 'T *', только для других интеллектуальных указатели – xvan

+0

@xvan это не уступка, но строительство –

ответ

4

Конструктор явно, чтобы предотвратить кого-то делать что-то вроде этого:

void foo(std::shared_ptr<std::string> s) { } 

int main() 
{ 
    std::string s; 
    foo(&s); 
} 

Если подразумевалось, то shared_ptr может взять на себя ответственность переменной стека выделяется и попытаться удалить it..which не имеет смысла.

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

  • Нет связанных вопросов^_^