具有箭头符号的C ++模板自动返回类型需要decltype吗?

时间:2018-07-31 17:52:51

标签: c++ templates c++14

C ++ 11在函数中为返回类型引入了箭头符号(不知道名称):

template <typename T>
auto fun(T&& a) -> decltype(bar(a)){ ... }

但是根据scott meyer的说法,使用auto作为返回类型本身将删除所有const和reference限定符(因为它遵循与模板推导相同的模式),因此,惯用的方法是执行decltype(auto)保持所有限定词在类型之上。

但是,在这种情况下,auto被推断为decltype(bar(a))吗?那么decltype(auto)decltype(decltype(bar(a)))吗?那是多余的吗?

2 个答案:

答案 0 :(得分:11)

当您拥有trailing return type时,auto关键字将纯粹作为表示法的元素出现。返回类型变为->之后的任何类型。不执行类型推断。这就是编写带有尾随返回类型的函数声明的简单方式。仅当您具有尾随返回类型时才发生自动返回类型推断,即auto被用作占位符返回类型,而在函数末尾没有-> …声明者。

答案 1 :(得分:4)

假设int& bar();(或使用跟踪返回类型语法auto bar() -> int&;

您可以声明几个函数:

  • int& f1();auto f1() -> int&;
  • decltype(bar()) f2();auto f2() -> decltype(bar());。 (返回类型为int&)。 decltype允许SFINAE用作模板功能。
  • decltype(auto) f3() { return bar(); }需要定义(推导为int&)(无SFINAE)。
  • auto f4() { return bar(); }需要定义(推导为int)(无SFINAE)。

decltype(expression)类型,而decltype(type)无效,因此 decltype(decltype(expression))也是无效的。