Новый стандарт C ++ 11 добавляет новый синтаксис объявления функции с завершающим типом возврата:
// Usual declaration
int foo();
// New declaration
auto foo() -> int;
Преимущество этого синтаксиса состоит в том, что он позволяет выводить тип возвращаемого значения, например:
template<class T, class U>
auto bar(T t, U u) -> decltype(t + u);
Но потом почему возвращаемый тип был поставлен перед именем функции? Я полагаю, что одним из ответов будет то, что в то время не было необходимости в таком выводе типа. Если так, есть ли причина для гипотетического нового языка программирования не использовать конечный тип возврата по умолчанию?
Как всегда, К&R «плохие парни» здесь. Они разработали этот синтаксис функции для C, и C ++ в основном унаследовал его как есть.
Дикие догадки здесь:
В C объявление должно указывать на использование, т. Е. Как получить значение из чего-либо. Это отражено в:
int i;
, int
доступ к письму i
int *p;
, int
доступ к письму *p
int a[n];
, int
доступ к письму a[n]
int f();
, int
доступ к письму f()
Таким образом, весь выбор зависел от случая «простых значений». И, как уже заметил @JerryCoffin, причина, по которой мы получили type name
вместо name : type
вероятно, похоронен в древней истории языков программирования. Я думаю, К&R взял type name
так как легче сделать акцент на использовании и при этом иметь указатели и т. д. быть типами.
Если бы они выбрали name : type
они бы либо отключили использование от объявлений: p : int*
иначе бы указатели больше не были типами, а вместо этого были бы чем-то вроде украшения имени: *p : int
,
От себя лично: представьте, если бы они выбрали последний вариант, а C ++ унаследовал это — это просто не сработало бы, так как C ++ делает упор на типы вместо использование. Это также причина, почему int* p
называется «C ++ way» и int *p
быть «C путь».
Если так, есть ли причина для гипотетического нового языка программирования не использовать конечный тип возврата по умолчанию?
Есть ли причина не использовать вычет по умолчанию? 😉 Смотрите, например, Python или Haskell (или любой функциональный язык в этом отношении, IIRC) — явно не указаны типы возврата. Есть также движение, чтобы добавить эту функцию в C ++, так что когда-нибудь в будущем вы можете увидеть только auto f(auto x){ return x + 42; }
или даже []f(x){ return x + 42; }
.
C ++ основан на C, который был основан на B, который был основан на BCPL, который был основан на CPL.
Я подозреваю, что если бы вы проследили всю историю, вы, вероятно, оказались бы в Фортране, который использовал такие объявления, как integer x
(в отличие, например, от Pascal, который использовал объявления вроде: var x : integer;
).
Аналогично, для функции Паскаль использовал что-то вроде function f(<args>) : integer;
При таких обстоятельствах, вероятно, можно с уверенностью предположить, что (по крайней мере, в этом конкретном отношении) синтаксис Паскаля, вероятно, будет лучше соответствовать выводу типа.