C++ decltype(auto) or decltype(std::<T>forward(value))?

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

本文关键字:decltype gt forward value or C++ auto lt std      更新时间:2023-10-16

例如,简单的身份函数:

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

返回值更好(C 14和更新):

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

还是相同?

还是它们相同?

假设您正确编写:

constexpr decltype(auto) operator ()(T && i)
{
    return std::forward<T>(i);
}

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

包含占位符类型的T类型和相应的 初始化器e,确定如下:

  • 对于未录取的返回语句,该语句发生在包含占位符类型的返回类型的函数中, T是 声明的返回类型,e是返回语句的操作数。如果 返回语句没有操作数,则evoid();

如果占位符是decltype(auto)类型特定符,则T为 占位符。T推论的类型被确定为 在[dcl.type.simple]中进行了描述,好像edecltype

函数的返回类型是从return e;推导的,好像由decltype(e)推论。因此,它与显式decltype(std::forward<T>(i))相同。

什么更好

在这种情况下,我会选择"更少的是更多"。decltype(auto)以更少的详细性为您提供了自己的意思。