c ++ decltype(auto)或decltype(std :: forward (值))?

问题描述 投票:3回答:1

例如,简单的身份仿函数:

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)

或者他们是一样的吗?

c++ c++14 auto decltype
1个回答
4
投票

或者他们是一样的吗?

假设你写得正确:

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

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

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

  • 对于在使用包含占位符类型的返回类型声明的函数中发生的非废弃返回语句,T是声明的返回类型,e是return语句的操作数。如果return语句没有操作数,那么e就是void();

如果占位符是decltype(auto)类型说明符,则T应仅为占位符。 T推导出的类型如[dcl.type.simple]所述确定,好像e一直是decltype的操作数。

函数的返回类型是从return e;推导出来的,就像decltype(e)一样。所以它与明确的decltype(std::forward<T>(i))相同。

什么是更好的

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

© www.soinside.com 2019 - 2024. All rights reserved.