13

新的 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);

但是为什么首先将返回类型放在函数名之前呢?我想一个答案是当时不需要这种类型的扣除。如果是这样,假设的新编程语言是否有理由默认不使用尾随返回类型?

4

2 回答 2

9

一如既往,K&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隐藏在编程语言的古老历史中。我猜 K&Rtype name认为它更容易强调使用并且仍然有指针等是类型。

如果他们选择了name : type,他们要么会从声明中分离使用:p : int*要么会让指针不再是类型,而是像对名称的装饰一样:*p : int

就个人而言:想象一下,如果他们选择了后者并且 C++ 继承了它——它根本就行不通,因为 C++ 强调类型而不是使用这也是为什么int* p说是“C++方式”,int *p是“C方式”的原因。

如果是这样,假设的新编程语言是否有理由默认不使用尾随返回类型?

是否有理由默认不使用扣除?;) 参见,例如 Python 或 Haskell(或任何与此相关的函数式语言,IIRC)——没有明确指定返回类型。还有一个将这个特性添加到 C++ 的运动,所以在未来的某个时候你可能会看到只是auto f(auto x){ return x + 42; }或什至[]f(x){ return x + 42; }.

于 2012-10-03T03:30:18.550 回答
7

C++是基于C的,B是基于B的,BCPL是基于CPL的。

我怀疑如果你要追溯整个历史,你可能最终会使用 Fortran,它使用了类似的声明integer x(而不是,例如,Pascal,它使用了类似的声明:)var x : integer;

同样,对于一个函数,Pascal 使用了类似function f(<args>) : integer;Under the situation,可以安全地猜测(至少在这个特定方面)Pascal 的语法可能更适合类型推导。

于 2012-10-03T03:01:13.613 回答