Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “什么是”呢-&燃气轮机&引用;函数声明之后?_C++_C++11 - Fatal编程技术网

C++ “什么是”呢-&燃气轮机&引用;函数声明之后?

C++ “什么是”呢-&燃气轮机&引用;函数声明之后?,c++,c++11,C++,C++11,在一个系统头文件中,我看到如下表达式: auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> {…} 自动创建任务(\u Ty\u参数)->任务 {…} 我不知道“->”是什么意思,它不是指针表达式或lambda表达式,有人能帮我吗?这是C++11中新的函数声明语法,它被称为“尾部返回类型”。在函数声明的末尾,->表示函数的返回类型如下。它只能

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

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{…}
自动创建任务(\u Ty\u参数)->任务
{…}

我不知道“->”是什么意思,它不是指针表达式或lambda表达式,有人能帮我吗?

这是C++11中新的函数声明语法,它被称为“尾部返回类型”。在函数声明的末尾,
->
表示函数的返回类型如下。它只能在使用
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>;

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


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

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

template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
    return x + y;
}
模板
自动添加(常量T&x、常量U&y)->取消类型(x+y)
{
返回x+y;
}

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

顺便说一句,对于谷歌搜索,术语是“尾部返回类型”。即使使用常规返回类型,您也可以访问参数类型,因为模板参数始终首先声明。您无法访问的是参数名,甚至是函数名。
template<typename T, typename U>
??? add(const T& x, const U& y)
{
    return x + y;
}
template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
    return x + y;
}