Урок №65. Вивід типів: ключове слово auto

  Юрій  | 

  Оновл. 4 Вер 2021  | 

 283

До C++11 ключове слово auto було найменш використовуваним ключовим словом в мові C++. З уроку №51 ми вже знаємо, що локальні змінні мають автоматичну тривалість життя (створюються в точці оголошення і знищуються в кінці блоку, в якому оголошені).

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

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

Вивід типів в C++11

У C++11 значення ключового слова auto змінилося. Розглянемо наступний стейтмент:

Якщо мова 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.

Хоча це може здатися зручним, але я не рекомендую так робити. Тип значення, що повертається з функції, допомагає зрозуміти викликаючому об’єкту, що саме функція повинна повертати. Якщо конкретний тип не вказано, то викликаючий об’єкт може невірно інтерпретувати тип значення, що може призвести до помилок.

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

trailing-синтаксис в C++11

У C++11 з’явилася можливість використовувати trailingсинтаксис типу значення, що повертається (або просто “trailing-синтаксис”), коли компілятор робить висновки про тип значення, що повертається, по кінцевій частині прототипу функції. Наприклад, розглянемо наступне оголошення функції:

У C++11 це можна записати як:

В цьому випадку auto не виконує вивід типу — це всього лише частина trailing-синтаксису типу значення, що повертається. Навіщо тоді це взагалі слід використовувати? Це зручно. Наприклад, можна вивести в колонку всі імена ваших функцій:

Але цей синтаксис більш корисний в поєднанні з деякими іншими просунутими особливостями мови C++, такими як класи і ключове слово decltype.

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

Висновки

Починаючи з C++11 ключове слово auto може використовуватися замість типу змінної при ініціалізації для виконання виводу типу. У всіх інших випадках використання ключового слова auto слід уникати, якщо на це немає вагомих причин.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (6 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *