c++ decltype(auto) 还是 decltype(std::forward<T>(value))?

vla*_*don 5 c++ decltype auto c++14

例如,简单的恒等函子:

template <typename T>
class identity
{
public:
    constexpr auto operator ()(T && i) -> decltype(std::forward<T>(i))
    {
        return std::forward<T>(i);
    }
};
Run Code Online (Sandbox Code Playgroud)

返回值有什么更好的(C++14 和更新版本):

  • -> decltype(std::forward<T>(i)) 或者
  • -> decltype(auto)

或者他们是一样的?

Sto*_*ica 5

或者他们是一样的?

假设你写得正确:

constexpr decltype(auto) operator ()(T && i)
{
    return std::forward<T>(i);
}
Run Code Online (Sandbox Code Playgroud)

他们是一样的。[dcl.type.auto.deduct] :

A型T包含占位符类型,和对应的初始值设定e,被确定如下:

  • 对于在使用包含占位符类型的返回类型声明的函数中出现的非丢弃 return 语句,T是声明的返回类型并且e是 return 语句的操作数。如果 return 语句没有操作数,则evoid();

如果占位符是decltype(auto)类型说明符,T则应为单独的占位符。推导的类型T如 [dcl.type.simple] 中所述确定,就好像e它是decltype

函数的返回类型是从return e;as推导出来的decltype(e)。所以它和一个显式的decltype(std::forward<T>(i)).

什么是更好的

在这种情况下,我会选择“少即是多”。decltype(auto)以更少的冗长为您提供您想要的东西。