与普通返回类型相比,在 C++11 中指定尾随返回类型有什么优势?在此处查看 foo1
与 foo2
:
int foo1() {
return 1;
}
auto foo2() -> int {
return 1;
}
int main() {
foo1();
foo2();
}
最佳答案
在这个例子中,它们的意思完全相同。
但是,始终如一地使用尾随返回类型形式有一些优势(Phil Nash 称这些为 "East End Functions" ,因为返回类型位于东端)。
使用参数。显然,在使用参数确定返回类型时,您必须使用尾随返回类型。
template <typename T> auto print(T const& t) -> decltype(std::cout << t) { return std::cout << t; }
名称查找。在尾随返回类型中,名称查找包括成员函数定义的类范围。这意味着如果您想返回一个嵌套类,您不必重新输入类:
Type C::foo() { ... } // error: don't know what Type is C::Type C::foo() { ... } // ok auto C::foo() -> Type { ... } // ok
同样,对于定义成员函数,其中出于某种原因必须消除类名在全局命名空间中的歧义并且返回类型是一个类:
D ::C::foo() { ... } // error, parsed as D::C::foo() { ... } auto ::C::foo() -> D { ... } // ok
更合理的信息排序。假设您要编写一个函数
to_string
,它接受一个int
并返回一个string
。这是一种非常明智的措辞方式。函数名、参数、返回类型。你不会说你想写一个名为to_string
的string
返回函数,它接受一个int
。这是一个尴尬的信息顺序。名称是最重要的,其次是参数,最后是返回类型。尾随返回式表格使您可以更好地订购这些信息。
有些情况下 trailing-return-type 是强制性的,有些情况下它很有帮助,有些情况下它做同样的事情。除了简单的字符数之外,没有其他情况会更糟。
此外,从数学上讲,我们习惯于将函数视为 A -> B
而不是 B(A)
,因此 auto(* )(A) -> B
作为函数指针接受 A
并返回 B
比 B(* )(A)
.
另一方面,编写 auto main() -> int
看起来很荒谬。
但老实说,这主要是因为不熟悉。这本身并没有什么可笑的。如果有的话,有点不幸的是该语言在这里使用 auto
作为声明函数的方式 - 不是因为它太长(即其他一些语言使用 fun
甚至 fn
) - 但因为它与 auto
的其他用途并没有真正区别。如果它是 func
,我认为它会更好(尽管现在更改没有任何意义)。
最终,这纯粹是基于意见。只需编写有效的代码即可。
关于c++ - 在 C++11 函数中使用尾随返回类型的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52103775/