为什么C++11中需要decltype? [重复]

问题描述 投票:0回答:3

我正在学习

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
不能做的事情吗?

c++ c++11 auto decltype
3个回答
21
投票

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
通常是您想要使用的。


2
投票

虽然获取使用

auto
声明的变量很有用,但如果您实际上需要知道表达式的类型,例如,在为模板化函数生成返回类型时,
auto
还不够:您不需要只需命名一个值,但您需要掌握类型,例如修改它。如果有什么东西可以被丢弃的话,那就是
auto
。然而,使用
decltype()
往往会更加冗长,即
auto
是一个很好的捷径。


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

© www.soinside.com 2019 - 2024. All rights reserved.