7

我正在学习decltypeC++ 11。

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

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

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

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

我不明白为什么decltype需要。

能做decltype哪些不能做的事auto

4

3 回答 3

20

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在那里使用。

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

于 2013-09-16T15:37:32.677 回答
2

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

于 2013-09-16T15:38:41.103 回答
0

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 主要用于模板编程。

于 2018-08-02T16:51:40.583 回答