1. C++11特性之类型自动推导auto和decltype的使用

本文深入探讨了C++11中auto与decltype关键字的使用限制、好处及习惯,详细解析了它们在初始化、引用、const和泛型编程中的行为差异。通过对比auto与decltype,帮助读者掌握在现代C++编程中如何有效运用这两个关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声名:本文在学习时参考北京邮电大学崔崔毅东、杨谈老师的C++程序设计(面向对象进阶)的课程
C++11中,auto关键字放在变量之前,作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。
decltype是在编译期推导一个表达式的类型,它只做静态分析,因此它不会导致已知类型表达式执行。decltype 主要用于泛型编程(模板)

1. auto的使用限制

1.1. auto 变量必须在定义时初始化,这类似于const关键字
auto a1 = 10;  //正确 
auto b1;   //错误,编译器无法推导b1的类型
b1 = 10;
1.2. 定义在一个auto序列的变量必须始终推导成同一类型
auto a4 = 10, a5{20};   //正确 
auto b4{10}, b5 = 20.0; //错误,没有推导为同一类型
1.3. 如果初始化表达式是引用或const,则去除引用或const语义。
int a{10}; int &b = a;
auto c = b;   //c的类型为int而非int&(去除引用)
const int a1{10};
auto b1 = a1; //b1的类型为int而非const int(去除const) 
1.4. 如果auto关键字带上&号,则不去除引用或const语意
int a = 10; int& b = a;
auto& d = b;//此时d的类型才为int&
const int a2 = 10;
auto& b2 = a2;//因为auto带上&,故不去除const,b2类型为const in
1.5. 初始化表达式为数组时,auto关键字推导类型为指针。
int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl; //输出int * (输出与编译器有关)
1.6. 若表达式为数组且auto带上&,则推导类型为数组类型。
int a7[3] = { 1, 2, 3 };
auto& b7 = a7;
cout << typeid(b7).name() << endl; //输出int [3] (输出与编译器有关)
1.7. C++14中,auto可以作为函数的返回值类型和参数类型

2. auto使用的好处和使用习惯

2.1保证在声明变量时即初始化,使用auto是为了代码的正确性、性能、可维护性、健壮性,以及方便
2.2 避免在一行中使用直接列表初始化和拷贝列表初始化
auto x { 1 }, y = { 2 };  // 不要同时使用直接和拷贝列表初始化
2.3 使用的一些例子
Classic C++ Style (经典C++风格)Modern C++ Style(现代C++风格)
int x = 42;auto x = 42;
float x = 42.;auto x =42.f;
unsigned long x = 42;auto x = 42ul;
std::string x = “42”;auto x = "42"s; //c++14
chrono::nanoseconds x{ 42 };auto x = 42ns; //c++14
int f(double);auto f (double) -> int; auto f (double) { // };auto f = { /*… */ }; //匿名函数

3.decltype关键字用法

decltype利用已知类型声明新变量。有时候想要从表达式的类型推断出要定义的变量类型,但不想用该表达式的值初始化变量,就使用到了decltype。decltype是在编译期推导一个表达式的类型,它只做静态分析,它不会导致已知类型表达式执行。 decltype 主要用于泛型编程(模板)。

#include<iostream>
2.using namespace std;
3.int  fun1()  { return 10;  }
4.auto fun2()  { return 'g'; }  // C++14
5.int main(){
6.    // Data type of x is same as return type of fun1()
7.    // and type of y is same as return type of fun2()
8.    decltype(fun1()) x;  // 不会执行fun1()函数
9.    decltype(fun2()) y = fun2();
10.    cout << typeid(x).name() << endl;
11.    cout << typeid(y).name() << endl;
12.    return 0;
13.}

4. decltype与auto的对比

decltype和auto都是C++11自动类型推导的关键字。它们有很多差别:
auto忽略最上层的const,decltype则保留最上层的const
auto忽略原有类型的引用,decltype则保留原有类型的引用
对解引用操作,auto推断出原有类型,decltype推断出引用;auto推断时会实际执行,decltype不会执行,只做分析。总之在使用中过程中和const、引用和指针结合时需要特别小心。

总结

auto与初始化列表结合的会遇到很多细节需要考虑,需要更多实践代码中来分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值