为什么在C++ 11中需要decltype?

Ken*_*Lee 5 c++ decltype auto c++11

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

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

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

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

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

我不明白为什么需要"decltype".

"decltype"可以做"自动"不能做的事情吗?

提前致谢.

Rei*_*ica 18

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;
}
Run Code Online (Sandbox Code Playgroud)

参数声明中没有初始化器(也没有),因此您无法auto在那里使用.

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