是否有区别:
template <class T>
constexpr decltype(auto) f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
return std::get<0>(std::forward<T>(x));
}
和:
template <class T>
constexpr auto f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
return std::get<0>(std::forward<T>(x));
}
如果是这样,它是什么,我应该使用哪个来完美转发?
最佳答案
尾随返回类型只能与 auto
一起使用decltype(auto)
与 auto
的重点在于 distinguish the case whether the return type should be a reference or value 。但是在您的情况下,返回类型已经明确定义为 decltype(std::get<0>(std::forward<T>(x)))
,因此即使您使用 auto
,它也会被完美转发。
在 auto f() -> T
中,“auto”关键字只是一个 syntactic construct to fill in a type position 。它没有其他用途。
实际上,在 C++17 中,您不能将 decltype(auto)
与 trailing-return-type 一起使用。
C++14 措辞(n3936 §7.1.6.4[dcl.spec.auto]/1):
C++17 措辞(n4618 §7.1.7.4[dcl.spec.auto]/1):
这是 DR 1852 ,参见 Does a placeholder in a trailing-return-type override an initial placeholder? 。
实际上,虽然 gcc
接受 decltype(auto) f() -> T
( which is a bug ),但 clang
会 拒绝 它说
error: function with trailing return type must specify return type 'auto',
not 'decltype(auto)'
关于c++ - auto、decltype(auto) 和尾随返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42744245/