C++ 为什么返回类型在函数名之前?
新的C++11标准添加了一个带有尾随返回类型的新函数声明语法:C++ 为什么返回类型在函数名之前?,c++,c++11,language-design,return-type,function-signature,C++,C++11,Language Design,Return Type,Function Signature,新的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); 模板 自动条(T,U)->取消类型(T+U); 但是为什么返回类型首先放在函数名之前?我想一个
// Usual declaration
int foo();
// New declaration
auto foo() -> int;
此语法的优点是可以推导返回类型,如:
template<class T, class U>
auto bar(T t, U u) -> decltype(t + u);
模板
自动条(T,U)->取消类型(T+U);
但是为什么返回类型首先放在函数名之前?我想一个答案是,在当时没有必要进行这种类型推断。如果是这样的话,是否有理由假设一种新的编程语言在默认情况下不使用尾随返回类型?C++基于C,它基于B,它基于BCPL,后者基于CPL 我怀疑如果你要追踪整个历史,你可能会在Fortran上结束,它使用了像
integer x
这样的声明(例如,与Pascal相反,Pascal使用了像:var x:integer;
)这样的声明)
同样,对于一个函数,Pascal使用了类似于函数f():integer
在这种情况下,可以安全地猜测(至少在这个特定方面)Pascal的语法可能更适合类型推断。一如既往,K&R是这里的“坏蛋”。他们设计了C和C++的函数语法,基本上继承了它的原样。
胡乱猜测:
在C语言中,声明应该提示用法,即如何从某些内容中获取值。这反映在:
- 简单值:
inti代码>,
通过写入int
i
- 指针:
int*p代码>,
通过写入int
*p
- 数组:
inta[n]代码>,
通过写入int
a[n]
- 函数:
,intf()
通过写入int
f()
type name
而不是name:type
,可能是因为它埋藏在编程语言的古代历史中。我想K&R选择了类型名称
,因为它更容易强调用法,并且仍然有指针等类型
如果他们选择了name:type
,他们要么将用法从声明中分离出来:p:int*
,要么使指针不再是类型,而是名称的装饰:*p:int
在个人笔记中:想象一下,如果他们选择了后者,而C++继承了它,那就根本不起作用,因为C++强调了类型而不是使用。p>
如果是这样的话,是否有理由假设一种新的编程语言在默认情况下不使用尾随返回类型
是否有理由在默认情况下不使用扣减?;)请参阅,例如Python或Haskell(或任何函数式语言,IIRC)-未明确指定返回类型,所以将来你可能会看到,<代码>自动F(AutoX){返回x + 42;} < /Cord>,甚至. C++实际上不再像C++了…(@paddy:差不多是C++)now@Mehrdad:对。如果你旋转第二个
1
,C++
就是你得到的。“当时没有必要进行这种类型推断”——事实上。C的原始版本(以及激发它的原始语言)几乎没有类型,更不用说类型推断了。“默认情况下使用尾部返回类型”-没有默认值。要编写声明,必须选择一种或另一种样式。如果您的意思是“假设的新语言是否只能使用尾随返回类型?”当然,它可以;但是C++不能打破与所有现存代码的兼容性。看看Brian Kernighan,Pascal的语法为什么不被使用,这是很清楚的。@杰西古德:是的,也不是。至少我的回忆(这似乎不被一个快速的浏览过的东西所抵触)。他没有提到他对Pascal不喜欢的地方是intx;
vs.x:int
。同时,考虑到Pascal似乎普遍不喜欢,你可能是对的,从它复制几乎任何东西都可能不受欢迎。@JerryCoffin希望是这样,而C++11标准也不受欢迎另一种解读这些要点的方式是:(1)i
是int
,如果我们仅仅使用它。(2)p
是int
,如果我们不引用它。a
是int
,如果我们对它进行索引。f
是int
,如果我们称它为int。