在一个系统头文件中,我看到如下表达式:
自动创建任务(\u Ty\u Param)->;任务<;typename详细信息::_TaskTypeFromParam<_::Ty>_类型>;
{…}
我不知道是什么-&燃气轮机&引用;意思是,它不是指针表达式或lambda表达式,有人能帮我吗
这是来自C++11的新函数声明语法,它被称为“尾部返回类型”。在函数声明的末尾,->表示以下是函数的返回类型。它只能在使用auto关键字而不是您通常期望的实际返回类型时使用
例如,这两个声明是兼容的:
intfoo();
自动foo()->;int;
根据您的喜好,您可能会发现它比旧的声明语法更漂亮,尤其是当返回类型非常长/复杂时:
任务<;typename详细信息::_TaskTypeFromParam<_Ty>;::_类型>;创建任务(_Ty_参数);
自动创建任务(\u Ty\u参数)->;任务<;typename详细信息::_TaskTypeFromParam<_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)声明x和y才能工作,因此需要使用新语法