Опасен ли автоматический тип С++ 11?

Возможный дубликат:
Как слишком много с ключевым словом C++0x auto
Новое ключевое слово auto; Когда его следует использовать для объявления типа переменной?

В C++11 ввод переменной auto вместо, скажем, int позволит компилятору автоматически использовать правильный тип, выведенный из контекста инициализации. Это очень удобно в ситуациях, когда шрифт очевиден, но писать скучно. Есть ли подводные камни, о которых следует знать, или причины, по которым кто-то избегает этого?


person qdii    schedule 08.12.2011    source источник
comment
Если тип, который вы ожидаете получить, является типом выражения инициализатора, проблем быть не должно. Проблема в том, что это не то, что вы иногда ожидаете.   -  person Andrey Agibalov    schedule 08.12.2011
comment
¤ Одна из основных ловушек заключается в том, что auto позволяет вам поднять тип private из некоторого класса. Обычно такой тип, например. прокси, не предназначен для использования ни для чего, кроме какой-то специальной цели и особым образом. В C++03 нужно было использовать хитрый трюк с шаблонами, чтобы получить доступ к таким типам, но с C++11 auto, к сожалению, это очень легко сделать непреднамеренно... Cheers & hth.,   -  person Cheers and hth. - Alf    schedule 08.12.2011
comment
IMO Мне нравится использовать auto для итераторов. Я не знаю, безопасно это или нет, но у меня не было проблем с этим. Просто нужно знать, чего ожидать. Хотя, если вы используете методы класса, который вы инициализировали с помощью auto, компилятор, вероятно, предупредит вас, если методы не существуют, поскольку это не тот класс.   -  person Matej    schedule 08.12.2011
comment
Основная причина добавления auto заключалась не в ситуациях, когда тип очевиден и скучен для написания, он был добавлен, чтобы помочь в ситуациях, когда тип неочевиден и сложен для написания!   -  person Scott Langham    schedule 08.12.2011
comment
Проголосовали за открытие. Опасности, похоже, не обсуждаются в этих темах. Альф поднимает очень важный вопрос, и его следует затронуть в ответе на этот вопрос. - Использование auto может сломать программы, позволив программистам случайно получить типы, которые они никогда не должны были видеть.   -  person UncleBens    schedule 08.12.2011
comment
Альф: Не могли бы вы предоставить тестовый пример того, что вы объясняете? Я не уверен, что понимаю это ясно, и это звучит интересно.   -  person qdii    schedule 08.12.2011
comment
Пример: ideone.com/NzJBR. Проблема в том, что в C++03 возвращаемое значение можно было использовать только как безымянное временное. Было бы безопасно заполнить его ссылками/указателями на другие временные объекты. Но в С++ 11 вы можете создать его именованный экземпляр. Указатели/ссылки в X::Nested становятся оборванными, но именованный экземпляр продолжает жить! - Это не должно повлиять на большую часть кода, но показывает, что неразборчивое использование auto может нарушить дизайн, соответствующий стандарту C++03.   -  person UncleBens    schedule 08.12.2011


Ответы (1)


По моему личному опыту, auto удобен для универсального кода или таких вещей, как цикл for на основе диапазона, но вы можете получить что-то вроде

auto count = getCount();
if (count < 0) {
  // do something
}

Если getCount() возвращает беззнаковое число вместо ожидаемого (int), вы даже не получите предупреждения.

person Ralph Zhang    schedule 08.12.2011
comment
Вы правы, но на самом деле, если вы замените auto на int, вы также не получите предупреждение. - person log0; 08.12.2011
comment
GCC выдает мне предупреждение с -Wextra, поэтому я всегда строю с этим фрагментом (вместе с -Wall). - person Some programmer dude; 08.12.2011
comment
@Joachim Pileborg В этом случае вы также получите предупреждение с помощью auto. - person log0; 08.12.2011