Урок 62. Ключевое слово auto. Вывод типов

   ⁄ 

 Обновлено 23 мая 2017

  ⁄   

До C++ 11 ключевое слово auto было наименее используемым ключевым словом в C++. В уроке о локальных переменных мы узнали, что они имеют автоматическую продолжительность (создаются в точке определения и уничтожаются в конце блока, в котором размещены).

Ключевое слово auto использовалось для явного указания, что переменная должна иметь автоматическую продолжительность:

Однако, поскольку все переменные в современном C++ по умолчанию имеют автоматическую продолжительность, и, если не прописывать самому другой тип продолжительности, ключевое слово auto стало излишним и, следовательно, устаревшим.

Вывод типов в C++ 11

В C++ 11 значение ключевого слова auto изменилось, и теперь это полезное дополнение к вашему словарю C++.

Рассмотрим следующий стейтмент:

Если C++ и так знает, что 4.0 — это литерал типа double, так зачем нам дополнительно указывать, что x на самом деле типа double? Правда, было бы неплохо, если бы мы могли указать переменной принять соответствующий тип данных, основываясь на инициализируемом значении?

Начиная с C++ 11, ключевое слово auto делает именно это. При инициализации переменной оно может использоваться вместо типа переменной, чтобы сообщить компилятору, что он должен присвоить тип переменной исходя из инициализируемого значения. Это называется выводом типа (или автоматическим определением типов данных компилятором).

Например:

Это даже работает с возвращаемыми значениями в функциях:

Обратите внимание, это работает только с инициализируемыми переменными. Переменные, объявленные без инициализации, не могут использовать эту фичу (поскольку нет инициализируемого значения, компилятор не может знать, какой тип присвоить переменной).

Используя ключевое слово auto вместо фундаментальных типов данных, мы не сохраним много усилий или времени, но в следующих уроках, когда типы данных будут более сложными и длинными, ключевое слово auto может очень пригодится.

Ключевое слово auto не может использоваться с параметрами функций

Многие новички пытаются сделать что-то вроде этого:

Это не сработает, так как компилятор не может определить типы данных для параметров функции a и b во время компиляции.

Если вы хотите создать функцию, которая будет работать с разными типами данных, вам лучше воспользоваться шаблонами функций, а не выводом типа. Это ограничение, возможно, отменят в следующих версиях C++ (когда auto будет использоваться как сокращенный способ создания шаблонов функций), но в C++ 14 это не работает. Единственное исключение — лямбда-выражения, но о них поговорим позже.

Вывод типа функций в C++ 14

В C++ 14 функциональность ключевого слова auto была расширена для автоматического определения типа возвращаемого значения функции. Например:

Так как a − b типа int, то компилятор сделает вывод, что и функция должна быть типа int.

Хотя это может показаться удобным, мы не советуем так делать. Тип возвращаемого значения функции помогает понять caller-у, что именно функция должна возвращать. Если конкретный тип не указан, caller может неверно интерпретировать тип возвращаемого значения, что может привести к непреднамеренным ошибкам.

Так почему использование auto при инициализации переменных – это хорошо, а с функциями – плохо? Дело в том, что auto можно использовать при определении переменной, так как значение, из которого компилятор делает выводы по поводу типа переменной, находится прямо там, в правой части стейтмента. Однако с функциями это не так — нет контекста, который бы указывал, какого типа будет возвращаемое значение. Фактически пользователю придется лезть в тело функции, чтобы определить тип возвращаемого значения. Следовательно, такой способ не только не практичен, но и более подвержен ошибкам.

Синтаксис типа возвращаемого значения trailing в C++ 11

В C++ 11 также появилась возможность использовать синтаксис типа возвращаемого значения trailing, когда компилятор делает выводы о типе возвращаемого значения после остальной части прототипа функции.

Рассмотрим следующее объявление функции:

В C++ 11 это можно записать как:

В этом случае auto не выполняет вывод типа — это всего лишь часть синтаксиса типа возвращаемого значения trailing.

Зачем вы захотите это использовать?

В основном из-за удобства. Например, все имена ваших функций можно построить в ряд:

Но более полезен этот синтаксис в сочетании с некоторыми другими продвинутыми особенностями C++, такими как классы и ключевое слово decltype. Мы поговорим подробнее о других использованиях auto, когда будем рассматривать ключевое слово decltype.

На данный момент мы рекомендуем придерживать традиционного (обычного) синтаксиса для определения типа возвращаемого значения функции (без использования auto).

Итого

Начиная с C++ 11, ключевое слово auto может использоваться вместо типа переменной при инициализации для выполнения вывода типа.

Другие использования ключевого слова auto следует избегать, за исключением случаев, когда это очень необходимо или нет альтернативного решения.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 4,71 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *