В книге Скотта Мейера Эффективное Modern C++ мы можем прочитать, что:авто и static_casts - хорошая практика
std::vector<bool> features(const Widget& w);
Widget w;
…
bool highPriority = features(w)[5];
…
processWidget(w, highPriority);
и вариант с автоматической
auto highPriority = features(w)[5];
, который вызывает неопределенное поведение, из-за факт, что features()
возвращает std::vector<bool>
, который использует прокси-объект типа std::vector<bool>::reference
при возврате значения от opearator[]
.
В качестве решения этой проблемы рекомендуется не останавливать использование auto
, но используя static_casts
.
Так Скотт Мейерс совет использовать:
auto highPriority = static_cast<bool>(features(w)[5]);
вместо:
bool highPriority = features(w)[5];
Мой вопрос: Что такое реальная разница между этими двумя? На мой взгляд, оба они одинаковы, потому что оба метода делают рефакторинг сложнее точно таким же образом (изменение типа возвращаемого значения в функциях функции не делает переменной highPriority другим типом), а вторая - более короткой для записи.
Просто подозрение, но с моей головы я не могу думать о функциональном различии, и единственная причина Скотта может быть последовательностью - он не выступал за использование 'auto x =' для практического всего где-то в той же книге ...? (Или, может быть, это была какая-то статья в Интернете, которую я видел ...) –
@TonyD Да, консистенция, вероятно, является причиной. Он предлагает «предпочитать« авто »для явных деклараций типов» в пункте 5 – TartanLlama
Я бы сказал, что первое решение явно сообщает читателю: «дело не в bool, но я хочу, чтобы это было bool». Второе решение обычно говорит читателю: «Это bool или можно хотя бы использовать как таковое», но проблема в том, что большинство читателей читают его как «это bool» и, вероятно, «эй, теперь у нас есть« авто », поэтому мы пишем его 'auto highPriority = features (w) [5];'! "и стрела. Даже если оба решения технически идентичны, читатель сначала предупреждается, что может возникнуть проблема с непосредственным использованием 'features (w) [5]'. Кстати, та же проблема возникает с такими вещами, как шаблоны выражений. – leemes