C++11实用技术(一)auto与decltype的使用

简介: C++11实用技术(一)auto与decltype的使用


auto、decltype

C++11引入了两个关键字用于类型推导:auto和decltype。两个关键字的用法有所不同,可以在不同场景中应用,也可以结合使用在某些场景中。

auto和decltype是在编译时推导确认变量类型,所以也不会影响性能。

auto类型推导

auto推导的变量必须被初始化。因为编译器需要通过初始化来确定auto所代表的类型、即需要定义变量。

auto x = 5;     //x被推导为int类型
auto s;         //错误,auto无法推导没有被初始化的s的类型。
auto s = x;     //s被推导为和x一样的int类型

auto应用场景

auto在一些STL容器中有比较好的用武之地。特别是迭代器的遍历,例如:

#include <map>
int main()
{
  std::map<double, double> mp;
  ;
  for(std::map<double, double>::iterator it = mp.begin(); it != mp.end(); ++it)
  {
    //处理it内容
  }
  return 0;
}

应用auto做类型推导

#include <map>
int main()
{
  std::map<double, double> mp;
  ;
  for(auto it = mp.begin(); it != mp.end(); ++it)
  {
    //处理it内容
  }
  return 0;
}

可以看出使用auto后,代码简洁了许多。

decltype关键字

刚刚提到auto在推导变量类型时,所修饰的变量必须初始化。那不需要初始化的场景就需要使用到decltype关键字来做类型推导。

例如:

int x = 0;
decltype(x) y; //y 被推导为int类型
decltype (x + y) z = 0;//变量 z 被推导为 int 类型,通过使用 decltype 推导 x + y 的结果类型,并将其初始化为 0。

decltype应用场景

decltype通常应用在泛型编程中。例如常见模板类:

template <class ContainerT>
class Foo
{
public:
  void func(ContainerT& container)
  {
    it_ = container.begin();
  }
private:
  decltype(ContainerT().begin()) it_;
};

auto和decltype结合使用

template <typename T, typename U>
decltype(t + u) add(T t, U u) //错误, t,u在推导的时候还没有被定义
{
    return t + u;
}

这段代码编译不过,因为t,u在参数列表中,C++的返回值是前置语法,这里先推导返回值类型是找不到u,t的定义。

可以修改为返回类型后置语法

template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)//可以编译通过
{
    return t + u;
}

这也是auto、decltype最常用的组合用法。

进一步举例,decltype推导函数返回值也可以:

int& foo(int& i);
float foo(float& f);//这里是foo重载
template <typename T>
auto func(T& val) -> decltype(foo(val))
{
  return foo(val);
}
目录
相关文章
|
2月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
49 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
35 3
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
3月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
62 4
|
3月前
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
243 0
|
3月前
|
存储 编译器 C++
【C++关键字】auto的使用(C++11)
【C++关键字】auto的使用(C++11)
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
4月前
|
存储 编译器 C++
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么