首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C++11中需要解密?

为什么在C++11中需要解密?
EN

Stack Overflow用户
提问于 2013-09-16 15:34:23
回答 3查看 1.7K关注 0票数 7

我正在学习decltype在C++ 11。

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

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

在通用编程中,当很难表示类型时,我可以使用auto

代码语言:javascript
复制
template <typename T>
void MakeAnObject (const T& builder)
{
    auto val = builder.MakeObject();
    // do stuff with val
}

我不明白为什么需要decltype

decltype能做一些auto不能做的事情吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-16 15:37:32

auto的意思是“变量的类型是从初始化项中推导出来的。”

decltype指的是任意上下文中的类型。

下面是一个不能使用auto的示例

代码语言:javascript
复制
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

票数 20
EN

Stack Overflow用户

发布于 2013-09-16 15:38:41

虽然获取使用auto声明的变量很有用,但如果您实际上需要知道表达式的类型,例如,当为经过模板化的函数生成返回类型时,auto是不够的:您不仅需要命名一个值,还需要获得类型,例如,修改它。如果有什么可以放弃的话,那就是auto。然而,decltype()的使用往往要冗长得多,也就是说,auto是一个很好的捷径。

票数 2
EN

Stack Overflow用户

发布于 2018-08-02 16:51:40

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

示例:

代码语言:javascript
复制
auto x = 7; 
auto x = expression;

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

示例:

代码语言:javascript
复制
template <class T, class U>
auto mult(T& t1, U& u1) -> decltype (t1 * u1)
{
    return t1 * u1;
} 

即使是第二种情况下的汽车也可以替换为解密型,但汽车看上去不错。

代码语言:javascript
复制
decltype (j * i) m = j * i;

解密类型主要用于模板编程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18831901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档