在 C++11 函数中使用尾随返回类型的优点
Advantage of using trailing return type in C++11 functions
与普通返回类型相比,在 C++11 中指定尾随返回类型有什么优势?看看这里的foo1
与foo2
:
int foo1() {
return 1;
}
auto foo2() -> int {
return 1;
}
int main() {
foo1();
foo2();
}
在这个例子中,它们的意思完全相同。
但是,始终如一地使用尾随返回类型形式有一些优点(Phil Nash 称这些为"东端函数",因为返回类型位于东端(。
-
使用参数。显然,在使用参数确定返回类型时,必须使用尾随返回类型。
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
。这是一个尴尬的信息顺序。名称是最重要的,后跟参数,后跟返回类型。尾随返回类型表单允许您更好地对这些信息进行排序。
在某些情况下,跟踪返回类型是强制性的,在某些情况下它是有帮助的,在某些情况下它执行相同的操作。除了字符数之外,没有其他原因会使情况更糟的情况。
另外,从数学上讲,我们习惯于将函数视为A -> B
而不是B(A)
,因此auto(*)(A) -> B
函数指针接受A
并返回B
比B(*)(A)
更接近该视图。
另一方面,写auto main() -> int
看起来很荒谬。
但老实说,这主要是因为不熟悉。它本身并没有什么可笑的。如果有的话,有点不幸的是,语言在这里使用auto
作为声明函数的一种方式 - 不是因为它太长(即其他一些语言使用fun
甚至fn
( - 而是因为它与auto
的其他用途并没有真正的区别。如果它是func
,我认为它会更好(尽管现在改变没有任何意义(。
归根结底,这纯粹是基于意见的。只需编写有效的代码即可。
- c++ 11 带有 decltype 的尾随返回类型无法按预期工作
- 在 C++11 函数中使用尾随返回类型的优点
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- BackPort C 14返回类型扣除对C 11
- C++11 中的 decltype(auto) - 推断返回类型
- 是在C 11中没有返回类型的主机的使用情况
- 找出函子的返回类型 C++11Boost
- 这种尾随返回类型在C++11中合法吗
- 如何获取 lambda 的返回类型,在 C++11 中归约函数
- C++11:return_type(对于 std::bind),其中返回类型基于输入类型
- 我们什么时候可以省略 C++11 lambda 中的返回类型
- C++11 非模板化基类中的纯虚拟'templated'返回类型
- 如何在 C++11 之前模拟尾随返回类型的 decltype
- C++11 在特定情况下避免冗余返回类型
- 返回类型的C++11 方法模板专用化
- C++11对lambda返回类型的限制
- 带有返回类型推导的C++11运算符重载
- 在C++11中确定泛型返回类型时出错
- 模板方法中的C++11自动返回类型
- 如何确定C++11成员函数的返回类型