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);
}
目录
相关文章
|
18天前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
4天前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
20天前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
37 5
|
24天前
|
存储 编译器 程序员
C++一分钟之-auto关键字与类型推导
【6月更文挑战第21天】`auto`在C++11中重生,简化了类型声明,尤其在处理复杂类型时。它让编译器根据初始化值推导变量类型,减少了冗余和错误。使用`auto`简化了迭代器声明和函数返回类型推导,但也带来挑战:类型推导可能不直观,未初始化的`auto`是错误的,且过度使用影响可读性。使用`auto&`和`auto*`明确引用和指针,`decltype`辅助复杂类型推导,保持适度使用以维持代码清晰。
24 1
|
5天前
|
编译器 C++ 容器
在 C++ 中 auto什么意思
在 C++ 中 auto什么意思
|
1月前
|
C++
C++核心技术要点《友元函数,友元类》
C++核心技术要点《友元函数,友元类》
30 3
|
1月前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
36 2
|
1月前
|
C++
C++核心技术要点《异常处理详解》
C++核心技术要点《try-throw-catch异常处理详解》
33 2
|
1月前
|
C++
c++语言核心技术要点,《运行时类型识别RTTI》
c++语言核心技术要点,《运行时类型识别RTTI》
34 2
|
1月前
|
存储 算法 安全
用C++打造极致高效的框架:技术探索与实践
本文探讨了如何使用C++构建高性能框架。C++凭借其高性能、灵活性和跨平台性成为框架开发的理想选择。关键技术和实践包括:内存管理优化(如智能指针和自定义内存池)、并发编程(利用C++的并发工具)、模板与泛型编程以提高代码复用性,以及性能分析和优化。在实践中,应注意代码简洁性、遵循最佳实践、错误处理和充分测试。随着技术发展,不断提升对框架性能的要求,持续学习是提升C++框架开发能力的关键。
33 1