在一个系统头文件中,我看到如下表达式:
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}
我不知道“ - &gt;”意思是,它不是指针表达式或lambda表达式,任何人都可以帮助我吗?
答案 0 :(得分:49)
这是来自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>;
但有时候,当函数的返回类型随参数变化时,可能需要使用模板。
假设您想要一个模板化函数来添加变量:
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及更高版本中,为函数定义编写auto add(const T& x, const U& y)
而不使用尾随返回类型是合法的。换句话说,当你定义你的函数体时。)
问题是您无法事先告知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
“返回”表达式的类型。由于您需要为x
声明y
和decltype(x + y)
才能使用,因此您需要新的语法。