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)))
吗?那是多余的吗?
答案 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))
也是无效的。