我正在学习
decltype
C++ 11。
auto
和decltype
的功能似乎重复,我不明白为什么我们需要decltype
。
根据 wiki,它的主要用途是泛型编程,在泛型编程中,表达依赖于模板参数的类型通常很困难,甚至不可能。
在泛型编程中,当难以表达类型时我可以使用
auto
:
template <typename T>
void MakeAnObject (const T& builder)
{
auto val = builder.MakeObject();
// do stuff with val
}
我不明白为什么需要
decltype
。
decltype
可以做一些auto
不能做的事情吗?
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
通常是您想要使用的。
虽然获取使用
auto
声明的变量很有用,但如果您实际上需要知道表达式的类型,例如,在为模板化函数生成返回类型时,auto
还不够:您不需要只需命名一个值,但您需要掌握类型,例如修改它。如果有什么东西可以被丢弃的话,那就是auto
。然而,使用 decltype()
往往会更加冗长,即 auto
是一个很好的捷径。
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 主要用于模板编程。