В последнее время я разговаривал со многими людьми, которые говорят, что ожидают прекратить писать собственные мобильные приложения и начать писать веб-приложения, как только HTML5 будет более полно реализован в мобильных ОС. Я только что закончил свое первое глубокое погружение в HTML5, и я еще не убежден.
Будет ли HTML5 работать в качестве альтернативной платформы разработки для нативных приложений,
Их использование точно совпадает (так что я могу выполнить глобальный поиск / замену в моем коде (не то, чтобы я это делал, но если бы я это сделал)) или я должен знать о некоторых различиях, которые не очевидны при чтении документация?
Кроме того, если это прямая замена, зачем давать ему новое имя, а не просто улучшать std :: auto_ptr
?
Вы не можете выполнить глобальный поиск / замену, потому что вы можете скопировать auto_ptr
(с известными последствиями), но unique_ptr
можно только перемещать. Все, что выглядит как
std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2 = p;
, должно стать как минимум таким
std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2 = std::move(p);
Что касается других различий, unique_ptr
может правильно обрабатывать массивы (он вызовет delete []
, а delete []
, а auto_ptr
попытается вызвать delete
.
std :: auto_ptr
и std :: unique_ptr
в одних случаях несовместимы, а в других - нет возможности замены. Итак, отсутствие поиска / замены недостаточно. Однако после работы поиска / замены ошибки компиляции должны исправить все, кроме странных угловых случаев. Большинство ошибок компиляции потребуют добавления std :: move
.
unique_ptr
должен передаваться через вызов std :: move
. Это просто, поскольку компилятор будет жаловаться, если вы не сделаете это правильно. std :: auto_ptr
зла. Если класс запрещает копирование, то std :: unique_ptr
- это капля для замены. Однако, если вы попытались дать классу разумную семантику копирования, вам нужно будет изменить код обработки std :: auto_ptr
. Это просто, поскольку компилятор будет жаловаться, если вы что-то не поймете.Если вы разрешили копирование класса с членом std :: auto_ptr
без какого-либо специального кода, то позор вам и удачи. Таким образом, std :: unique_ptr
- это неразрывный std :: auto_ptr
. Он запрещает во время компиляции поведение, которое было часто ошибками при использовании std :: auto_ptr
. Поэтому, если вы использовали std :: auto_ptr
с должной осторожностью, переключение на std :: unique_ptr
должно быть простым. Если вы полагались на странное поведение std :: auto_ptr
, то вам все равно необходимо провести рефакторинг вашего кода.
AFAIK, unique_ptr
не является прямой заменой. Главный недостаток, который он исправляет, - это неявная передача права собственности.
std::auto_ptr<int> a(new int(10)), b;
b = a; //implicitly transfers ownership
std::unique_ptr<int> a(new int(10)), b;
b = std::move(a); //ownership must be transferred explicitly
С другой стороны, unique_ptr
будет иметь совершенно новые возможности: они могут храниться в контейнерах.