Чего можно достичь в собственном мобильном приложении, чего нельзя сделать в веб-приложении HTML5?

В последнее время я разговаривал со многими людьми, которые говорят, что ожидают прекратить писать собственные мобильные приложения и начать писать веб-приложения, как только HTML5 будет более полно реализован в мобильных ОС. Я только что закончил свое первое глубокое погружение в HTML5, и я еще не убежден.

Будет ли HTML5 работать в качестве альтернативной платформы разработки для нативных приложений,

Их использование точно совпадает (так что я могу выполнить глобальный поиск / замену в моем коде (не то, чтобы я это делал, но если бы я это сделал)) или я должен знать о некоторых различиях, которые не очевидны при чтении документация?

Кроме того, если это прямая замена, зачем давать ему новое имя, а не просто улучшать std :: auto_ptr ?

182
задан Melebius 8 July 2019 в 04:02
поделиться

3 ответа

Вы не можете выполнить глобальный поиск / замену, потому что вы можете скопировать 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 .

214
ответ дан 23 November 2019 в 06:05
поделиться

std :: auto_ptr и std :: unique_ptr в одних случаях несовместимы, а в других - нет возможности замены. Итак, отсутствие поиска / замены недостаточно. Однако после работы поиска / замены ошибки компиляции должны исправить все, кроме странных угловых случаев. Большинство ошибок компиляции потребуют добавления std :: move .

  • Переменная области действия:
    Совместимость на 100%, если вы не передаете ее по значению другой функции.
  • Тип возврата:
    не на 100% совместим, но совместим на 99%, это не кажется неправильным.
  • Параметр функции по значению:
    100% совместим с одним предостережением, unique_ptr должен передаваться через вызов std :: move . Это просто, поскольку компилятор будет жаловаться, если вы не сделаете это правильно.
  • Параметр функции по ссылке:
    Совместимость на 100%.
  • Переменная-член класса:
    Это непростая задача. Семантика копирования 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 , то вам все равно необходимо провести рефакторинг вашего кода.

90
ответ дан 23 November 2019 в 06:05
поделиться

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 будет иметь совершенно новые возможности: они могут храниться в контейнерах.

34
ответ дан 23 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: