Мотивація та підводні камені (?) Автоматичного ключового слова в C ++ 11


20

Нещодавно мені було цікаво, чому ключове слово autoбуло вибрано в C ++ 11 для позначення змінної, тип якої повинен бути зроблений компілятором, як у

auto x = 1;

З тих пір

  1. var видається більш поширеним в інших мовах програмування (наприклад, C #, Scala, JavaScript) та
  2. Наскільки я розумію нову семантику autoрозбитої сумісності назад (вона рідко використовувалася, але мала інше значення в попередніх редакціях C ++, див., Наприклад, тут )

Мені хотілося запитати, чи є особлива причина вибору auto(на користь varчи будь-якого іншого ключового слова). Чи були якісь конкретні дискусії з цього питання до виходу стандарту C ++ 11?

Також, чи є можливі несумісності, на які слід звернути увагу при перекомпіляції застарілого коду C ++ із компілятором C ++ 11?


9
Нова семантика autoможе порушити зворотну сумісність, але, залежно від того, як часто varвикористовується в якості імені змінної, порівняно з тим, як часто autoключове слово використовується в коді до 11, комітет, можливо, висловив думку про те, що він порушує сумісність менш кардинально, ніж введення нового ключове слово буде.
sepp2k

2
"Наразі це запитання не підходить для нашого формату запитання і відповідей. Ми очікуємо, що відповіді будуть підкріплені фактами, посиланнями чи конкретною експертизою, але це питання, ймовірно, вимагатиме дискусій, аргументів, опитування чи розширеного обговорення. Якщо ви вважаєте, що це питання можна вдосконалити та, можливо, повторно відкрити, дивіться вказівки до поширених запитань. ": Це запитання задає факт: чи обговорювалася ця тема. Є дві можливі відповіді: ТАК і НІ.
Джорджіо

2
Звичайно, відбулася дискусія, яка робить це питання начебто безглуздим у цьому плані. Питання autoпроти var- це те, на що посилається 90% вашого тексту, і це питання не має остаточного результату. (хоча я не той, хто проголосував за закриття)
Теластин

1
@Telastyn: Якби я знав, що на цю тему була дискусія, я б не питав. Гуглінг для "автоматично проти вар. C ++" або "автоматичного C ++" нічого не повертає на цю тему.
Джорджіо

1
autoбуло запропоновано для C ++ раніше, ніж varбуло введено в C #, тому має бути питання, чому C # не використовує авто. var має інше значення у JavaScript та Scala
adrianm

Відповіді:


37

Практично кожне слово, яке ви можете додати як ключове слово до мови, майже напевно було використано як ім'я змінної чи іншу частину робочого коду. Цей код буде порушений, якби ви зробили це слово ключовим словом.

Неймовірно щаслива річ у autoтому, що це вже було ключове слово, тому у людей не було змінних з цим ім'ям, але ніхто не використовував його, оскільки це було за замовчуванням. Чому типу:

auto int i=0;

коли

int i=0;

означало саме те саме?

Я припускаю, що десь на планеті була якась невелика кількість коду, яка використовувала «авто» по-старому. Але це можна було б виправити, видаливши "auto", і воно буде працювати знову. Тож було досить очевидним вибором змінити ключове слово.

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

Для уточнення (малого) розриву:

Якби у вас був

auto int i=0;

і спробувавши компілювати компілятор C ++ 11, тепер ви отримаєте помилку типу

помилка C3530: "auto" не може поєднуватися з будь-яким іншим специфікатором типу

Це тривіально, ви просто видалите або авто, або int та перекомпілювати.

Однак є більша проблема. Якби у вас був

auto i = 4.3;

C і справді старий C ++ зробив iби int(як це було б, якщо ви припинили auto- декларація за замовчуванням була int). Якщо ви пройшли дуже довгий час, не складаючи цей код, або використовуєте старі компілятори, ви могли б мати частину цього коду, принаймні теоретично. C ++ 11 зробив би це doubleтак, оскільки це 4.3. (Або, можливо float, я все ще перебуваю в режимі "Боксерський день", але справа не в цьому int.) Це може ввести непомітні помилки у вашому додатку. І без попереджень чи помилок компілятора. Люди в цьому човні повинні шукати глобально, autoщоб переконатися, що вони не використовували його старим способом, перш ніж перейти до компілятора C ++ 11. На щастя, такий код зустрічається вкрай рідко.


Дякую за дуже чітку відповідь. +1 Я розумію компроміс між відмовою від відсталої сумісності в основному нешкідливим способом і великим шансом, що старий код не буде порушений новим ключовим словом.
Джорджіо

Чи насправді взагалі є якась несумісність? Чи не буде компілятор C ++ 11 просто ігнорувати, autoякщо за ним слідує ім'я типу?
aaaaaaaaaaaa

1
Visual C ++ 2012 говорить error C3530: 'auto' cannot be combined with any other type-specifierпро це
Кейт Грегорі

3
@KateGregory: Власне, проблем із цим немає auto i = 4.3;, тому що це було неправильно сформовано в C ++ 03 / C ++ 98. C ++ нічого НЕ переносяться на «неявне» INT правило, C89 був (і впав в перегляді C99).
Барт ван Інген Шенау

1
@Kate Gregory: Якщо ви могли б взяти до уваги спостереження Барта і відповідно змінити свою відповідь, я би позначив це як прийняту відповідь.
Джорджіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.