函数声明后的“->”是什么?

在一个系统头文件中,我看到如下表达式:

自动创建任务(\u Ty\u Param)->;任务<typename详细信息::_TaskTypeFromParam&lt_::Ty&gt_类型>
{…}

我不知道是什么-&燃气轮机&引用;意思是,它不是指针表达式或lambda表达式,有人能帮我吗

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

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

intfoo();
自动foo()->int;

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

任务<typename详细信息::_TaskTypeFromParam&lt_Ty>::_类型>创建任务(_Ty_参数);
自动创建任务(\u Ty\u参数)->任务<typename详细信息::_TaskTypeFromParam&lt_Ty>::_类型>;

但有时,当函数的返回类型可能随参数而变化时,模板可能需要这样做

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

模板<typename T>
T添加(常量T&x、常量T&y)
{
返回x+y;
}

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

模板<类型名T、类型名U>
??? 添加(常量T&x、常量U&y)
{
返回x+y;
}

编辑:请注意,在C++14及以后的版本中,为函数定义编写自动添加(const T&x,const U&y)是合法的,不带尾随返回类型(换句话说,在定义函数体时)


问题在于,您无法提前知道x+y的结果类型。正如模板所示,它们甚至可以是非整数类型。(您是否希望能够执行添加(std::string(“x”),“y”)?)

Decltype,再加上新的函数声明语法,可以解决这个问题

模板<类型名T、类型名U>
自动添加(常量T&x、常量U&y)>decltype(x+y)
{
返回x+y;
}

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

发表评论