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

One*_*Day 4 c++ templates c++14

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

template <typename T>
auto fun(T&& a) -> decltype(bar(a)){ ... }
Run Code Online (Sandbox Code Playgroud)

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

但是,在这种背景下,auto推断是decltype(bar(a))?那会decltype(auto)decltype(decltype(bar(a)))吗?这会多余吗?

Mic*_*zel 12

如果有尾随返回类型,则auto关键字纯粹表示为表示法的元素.返回类型变为后面的任何类型->.不执行类型扣除.这就是如何编写具有尾随返回类型的函数声明.仅当您没有尾随返回类型时才会发生自动返回类型扣除,即,在函数声明auto-> …的末尾用作占位符返回类型而不是.


Jar*_*d42 5

假设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))也是无效的。