我正在学习decltype在C++ 11。
auto和decltype的功能似乎是重复的,我不明白为什么我们需要decltype。
根据维基的说法,它的主要用途是在通用编程中,通常很难甚至不可能表达依赖于模板参数的类型。
在通用编程中,当很难表示类型时,我可以使用auto:
template <typename T>
void MakeAnObject (const T& builder)
{
auto val = builder.MakeObject();
// do stuff with val
}我不明白为什么需要decltype。
decltype能做一些auto不能做的事情吗?
发布于 2013-09-16 15:37:32
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。
发布于 2013-09-16 15:38:41
虽然获取使用auto声明的变量很有用,但如果您实际上需要知道表达式的类型,例如,当为经过模板化的函数生成返回类型时,auto是不够的:您不仅需要命名一个值,还需要获得类型,例如,修改它。如果有什么可以放弃的话,那就是auto。然而,decltype()的使用往往要冗长得多,也就是说,auto是一个很好的捷径。
发布于 2018-08-02 16:51:40
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;
} 即使是第二种情况下的汽车也可以替换为解密型,但汽车看上去不错。
decltype (j * i) m = j * i;解密类型主要用于模板编程。
https://stackoverflow.com/questions/18831901
复制相似问题