【问题标题】:c++ decltype(auto) or decltype(std::forward<T>(value))?c++ decltype(auto) 还是 decltype(std::forward<T>(value))?
【发布时间】:2023-03-28 18:20:02
【问题描述】:

例如,简单的恒等函子:

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

返回值哪个更好(C++14 和更新版本):

  • -&gt; decltype(std::forward&lt;T&gt;(i))
  • -&gt; decltype(auto)

或者它们是一样的吗?

【问题讨论】:

  • 你可以只拥有auto 而没有-&gt; decltype
  • 或者如果你坚持decltype语义,就decltype(auto)
  • @JakeFreeman 具有价值语义
  • decltype(auto) operator () ... 也是有效的。
  • 顺便说一句,您应该知道i 不是转发参考。所以这也是需要考虑的事情。

标签: c++ c++14 auto decltype


【解决方案1】:

或者它们是一样的吗?

假设你写的正确:

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

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

一个类型 T 包含一个占位符类型,以及一个对应的 初始化器e,确定如下:

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

如果占位符是decltype(auto) 类型说明符,则T 应为 仅占位符。为T 推导出的类型确定为 在 [dcl.type.simple] 中描述,好像 edecltype

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

什么更好

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

【讨论】:

  • -&gt; T&amp;&amp; 呢?
  • @cpplearner - 由于引用折叠,也适用于转发引用(OP 没有)。您应该将其发布为答案(甚至可能提到没有转发参考的 OP)。我太累了
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多