【问题标题】:What is "->" after function declaration?函数声明后的“->”是什么?
【发布时间】:2020-08-10 06:31:24
【问题描述】:

在一个系统头文件中,我看到这样的表达式:

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{…}

我不知道“->”是什么意思,不是指针表达式也不是lambda表达式,谁能帮帮我?

【问题讨论】:

  • 顺便说一句,对于谷歌搜索,术语是“尾随返回类型”。

标签: c++ c++11


【解决方案1】:

这是来自 C++11 的新函数声明语法,称为“尾随返回类型”。在函数声明的末尾,-&gt; 表示以下是函数的返回类型。它只能在使用 auto 关键字而不是您通常期望的实际返回类型时使用。

例如,这两个声明是兼容的:

int foo();
auto foo() -> int;

根据您的喜好,您可能会发现它比旧的声明语法更漂亮,尤其是当返回类型非常长/非常复杂时:

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;

但有时模板可能是必要的,因为函数的返回类型可能随参数而变化。

假设你想要一个模板函数来添加变量:

template<typename T>
T add(const T& x, const T& y)
{
    return x + y;
}

这很好,但您只能添加相同类型的变量。假设您希望能够添加任何类型的变量(例如 add((int)1, (double)2))。

template<typename T, typename U>
??? add(const T& x, const U& y)
{
    return x + y;
}

编辑:请注意,在 C++14 及更高版本中,为函数 定义(换句话说, 当你定义你的函数体时)。


问题是你无法提前知道x + y 的结果类型是什么。就模板而言,它们甚至可以是非整数类型。 (你不想add(std::string("x"), "y")吗?)

Decltype 以及新的函数声明语法可以让您解决这个问题。

template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
    return x + y;
}

Decltype“返回”表达式的类型。由于您需要声明 xy 以使 decltype(x + y) 工作,因此您需要新语法。

【讨论】:

  • 即使使用常规返回类型,您也可以访问参数类型,因为模板参数总是首先声明。您无权访问的是参数名称,甚至是函数名称。
  • 为什么decltype(x + y) add(const T&amp; x, const U&amp; y) 不能工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多