【问题标题】:Why decltype is required in C++11?为什么在 C++11 中需要 decltype?
【发布时间】:2013-09-16 15:34:23
【问题描述】:

我正在学习 C++ 11 中的decltype

autodecltype 的功能似乎重复了,我不明白为什么我们需要decltype

根据wiki,它的主要用途是在泛型编程中,通常很难甚至不可能表达依赖于模板参数的类型。

在泛型编程中,难以表达类型时可以使用auto

template <typename T>
void MakeAnObject (const T& builder)
{
    auto val = builder.MakeObject();
    // do stuff with val
}

我不明白为什么需要decltype

decltype 可以做auto 做不到的事情吗?

【问题讨论】:

  • decltype 对于auto add(T a, T b) -&gt; decltype(a+b) 来说非常有用。
  • 如果你不想要一个变量,只想要一个type怎么办?
  • 'Do stuff with val' 可能是:std::vector&lt;decltype(val)&gt; v; /*...*/

标签: c++ c++11 auto decltype


【解决方案1】:

auto 表示“变量的类型是从初始化程序推导出来的。”

decltype 引用任意上下文中的类型。

这是一个你不能使用auto的例子:

template <typename T, typename U, typename V>
void madd(const T &t, const U &u, const V &v, decltype(t * u + v) &res)
{
  res = t * u + v;
}

参数声明中没有初始化器(也不可能),所以你不能在那里使用auto

问题是,decltype 的 99% 使用在模板中。那里没有等效的功能。在非模板代码中,auto 通常是您想要使用的。

【讨论】:

    【解决方案2】:

    虽然获取使用auto 声明的变量很有用,但如果您确实需要知道表达式的类型,例如,在为模板化函数生成返回类型时,auto 是不够的:您需要不仅要命名一个值,还需要掌握类型,例如修改它。如果可以删除任何内容,那就是auto。但是,decltype() 的使用往往会更加冗长,即,auto 是一个不错的捷径。

    【讨论】:

      【解决方案3】:

      auto 是从初始化器中推导出一个类型。

      例子:

      auto x = 7; 
      auto x = expression;
      

      decltype[E] 是名称或表达式 E 的类型(“声明类型”),可以在声明中使用。

      例子:

      template <class T, class U>
      auto mult(T& t1, U& u1) -> decltype (t1 * u1)
      {
          return t1 * u1;
      } 
      

      即使 auto 的第二种情况也可以用 decltype 替换,但 auto 看起来不错。

      decltype (j * i) m = j * i;
      

      decltype 多用于模板编程。

      【讨论】:

        猜你喜欢
        • 2017-08-17
        • 1970-01-01
        • 2023-03-07
        • 2011-06-18
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 2013-05-01
        相关资源
        最近更新 更多