Недавно я задавался вопросом, почему ключевое слово auto
было выбрано в C ++ 11 для обозначения переменной, тип которой должен выводиться компилятором, как в
auto x = 1;
поскольку
var
кажется более распространенным в других языках программирования (например, C #, Scala, JavaScript), и- Насколько я понимаю, новая семантика
auto
обратной совместимости разрывов (она использовалась редко, но имела другое значение в предыдущих версиях C ++, см., Например, здесь )
Я хотел спросить, была ли особая причина для выбора auto
(в пользуvar
или любого другого ключевого слова). Было ли какое-либо конкретное обсуждение этой проблемы до выпуска стандарта C ++ 11?
Кроме того, есть ли какие-либо возможные несовместимости, на которые мы должны обратить внимание при перекомпиляции устаревшего кода C ++ с компилятором C ++ 11?
c++
c++11
type-systems
Джорджио
источник
источник
auto
может нарушить обратную совместимость, но, в зависимости от того, как частоvar
используется имя переменной по сравнению с тем, как частоauto
ключевое слово используется в коде до 11, комитет мог бы предположить, что оно нарушает совместимость менее драматично, чем введение нового Ключевое слово будет.auto
Противvar
вопроса , что 90% вашего текста относится, и этот вопрос не имеет окончательного результата. (хотя я не тот, кто проголосовал за закрытие)auto
был предложен для C ++ до того, какvar
был введен в C #, поэтому вопрос должен заключаться в том, почему C # не использует auto. У var разные значения в JavaScript и ScalaОтветы:
Почти каждое слово, которое вы можете добавить в качестве ключевого слова к языку, почти наверняка использовалось в качестве имени переменной или какой-либо другой части рабочего кода. Этот код будет поврежден, если вы сделаете это слово ключевым словом.
Невероятно удачно то,
auto
что это уже было ключевое слово, поэтому у людей не было переменных с этим именем, но никто не использовал его, потому что это было по умолчанию. Почему типа:когда
имел в виду одно и то же?
Я предполагаю, что где-то на планете было какое-то небольшое количество кода, который использовал «auto» по-старому. Но это можно исправить, убрав auto, и он снова заработает. Так что это был довольно очевидный выбор - изменить ключевое слово.
Мне также кажется, что это более ясный смысл. Если вы работали с вариантами и тому подобным, когда вы видите,
var
вы можете подумать, что объявление как-то менее строго набрано, чем если бы вы сами нажимали все клавиши на клавиатуре, чтобы указать тип переменной. Мне,auto
становится понятнее, что вы просите компилятор автоматически определить тип, который так же силен, как если бы вы сами его указали. Так что это был действительно счастливый случай, который сделал доброе имя доступным для комитета.Чтобы уточнить (маленький) взлом:
Если у тебя есть
и попытался скомпилировать с компилятором C ++ 11, теперь вы получите ошибку, такую как
Это тривиально, вы просто удаляете auto или int и перекомпилируете.
Хотя есть большая проблема. Если у тебя есть
C и действительно старый C ++ сделали
i
быint
(как если бы вы прекратилиauto
- объявление по умолчанию былоint
). Если вы действительно долго обходились без компиляции этого кода или использовали старые компиляторы, у вас может быть немного этого кода, по крайней мере, в теории. C ++ 11 сделал бы это,double
так как это то, что 4.3. (Или, может бытьfloat
, я все еще в режиме «День подарков», но дело не в этомint
.) Это может привести к незначительным ошибкам в вашем приложении. И без каких-либо предупреждений или ошибок от компилятора. Люди в этой лодке должны искать глобально,auto
чтобы убедиться, что они не использовали его по-старому, прежде чем перейти к компилятору C ++ 11. К счастью, такой код встречается крайне редко.источник
auto
если за ним следует имя типа?error C3530: 'auto' cannot be combined with any other type-specifier
на эту строкуauto i = 4.3;
, потому что это было плохо сформировано в C ++ 03 / C ++ 98. В C ++ не было перенесено правило «implicit int», которое было в C89 (и оно было исключено из ревизии C99).