Мотивация и подводные камни (?) Ключевого слова auto в 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: Если бы я знал, что была дискуссия на эту тему, я бы не спросил. Поиск в Google для "auto vs. var C ++" или "auto C ++" ничего не дал по этой теме.
Джорджио
1
autoбыл предложен для C ++ до того, как varбыл введен в C #, поэтому вопрос должен заключаться в том, почему C # не использует auto. У var разные значения в JavaScript и Scala
adrianm 28.12.12

Ответы:

37

Почти каждое слово, которое вы можете добавить в качестве ключевого слова к языку, почти наверняка использовалось в качестве имени переменной или какой-либо другой части рабочего кода. Этот код будет поврежден, если вы сделаете это слово ключевым словом.

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

auto int i=0;

когда

int i=0;

имел в виду одно и то же?

Я предполагаю, что где-то на планете было какое-то небольшое количество кода, который использовал «auto» по-старому. Но это можно исправить, убрав auto, и он снова заработает. Так что это был довольно очевидный выбор - изменить ключевое слово.

Мне также кажется, что это более ясный смысл. Если вы работали с вариантами и тому подобным, когда вы видите, varвы можете подумать, что объявление как-то менее строго набрано, чем если бы вы сами нажимали все клавиши на клавиатуре, чтобы указать тип переменной. Мне,auto становится понятнее, что вы просите компилятор автоматически определить тип, который так же силен, как если бы вы сами его указали. Так что это был действительно счастливый случай, который сделал доброе имя доступным для комитета.

Чтобы уточнить (маленький) взлом:

Если у тебя есть

auto int i=0;

и попытался скомпилировать с компилятором C ++ 11, теперь вы получите ошибку, такую ​​как

ошибка C3530: 'auto' не может быть объединен с любым другим спецификатором типа

Это тривиально, вы просто удаляете 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если за ним следует имя типа?
аааааааааааа
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 ++ не было перенесено правило «implicit int», которое было в C89 (и оно было исключено из ревизии C99).
Барт ван Инген Шенау
1
@ Кейт Грегори: Если бы вы могли учесть замечания Барта и соответственно изменить свой ответ, я бы пометил его как принятый ответ.
Джорджио