auto和decltype的用法总结

一, auto

1, auto的作用

一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的返回类型. 这个时候, 我们就可以使用auto关键字来让编译器帮助我们分析表达式或者函数所属的类型. 比如:

auto item = val1 + val2;
auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 100);

如果val1和val2都是int类型, 那么item也是int类型, 如果val1和val2是double类型, 那么item就是double类型. 而create()的返回值类型有可能会很复杂, 我们可以不用管, 这就使我们编程更加方便简单

2, auto和const

auto会忽略掉顶层const, 保留底层const.  举例:

const int i = 5;
auto a = i;        // 变量i是顶层const, 会被忽略, 所以b的类型是int
auto b = &i;    // 变量i是一个常量, 对常量取地址是一种底层const, 所以b的类型是const int *

因此, 如果希望推断出的类型是顶层const的, 那么就需要在auto前面加上cosnt:

const auto c = i;

3, auto和引用

① 如果表达式是引用类型, 那么auto的类型是这个引用的对象的类型.

int i = 2, &ri = i;
auto k = ri;            // k是int类型, 而不是引用类型

② 如果要声明一个引用, 就必须要加上&, 如果要声明为一个指针, 既可以加上*也可以不加*

int i = 3;
auto &refi = i;        // refi是一个int类型的引用
auto *p1 = &i;       // 此时推断出来的类型是int, p1是指向int的指针
auto p2 = &i;        // 此时推断出来的类型是int*, p2是指向int的指针

二, decltype

1, decltype的作用

decltype只是为了推断出表达式的类型而不用这个表达式的值来初始化对象.

decltype(func()) sum = x; // sum的类型是函数func()的返回值的类型, 但是这时不会实际调用函数func()
int i = 0;
decltype(i) j = 4; // i的类型是int, 所以j的类型也是int

2, decltype和const

不论是顶层const还是底层const, decltype都会保留

const int i = 3;
decltype(i) j = i; // j的类型和i是一样的, 都是const int

3, decltype和引用

① 如果表达式是引用类型, 那么decltype的类型也是引用

const int i = 3, &j = i;
decltype(j) k = 5; // k的类型是 const int &

② 如果表达式是引用类型, 但是想要得到这个引用所指向的类型, 需要修改表达式:

int i = 3, &r = i;
decltype(r + 0) t = 5; // 此时是int类型

③ 对指针的解引用操作返回的是引用类型

int i = 3, j = 6, *p = &i;
decltype(*p) c = j; // c是int类型的引用, c和j绑定在一起

④ 如果一个表达式的类型不是引用, 但是我们需要推断出引用, 那么可以加上一对括号, 就变成了引用类型了

int i = 3;
decltype((i)) j = i; // 此时j的类型是int类型的引用, j和i绑定在了一起
时间: 2024-08-25 05:36:01

auto和decltype的用法总结的相关文章

C++ 中 auto 与 decltype 的用法与区别

最近在恶补 C++ 知识的时候,学习到了一些 C++11 标准的新特性,利用这些新特性,我们能够更快地提高编程效率,从而实现我们的目标,在此特意记下学习过程中所学习到的一些东西,方便日后的回顾和复习. auto 关键字 在我们日常编程的时候,我们常常需要把表达式的值赋给变量,需要在声明变量的时候,我们必须清楚的知道变量是属于什么类型的.然而往往有些时候,我们做到这一点并非易事.为了解决这个问题, C++11 新标准就引入了 auto 类型说明符,通过使用 auto 关键字,我们就能让编译器替我们

C++11之auto和decltype

auto自动类型推断,用于从初始表达式中推断出变量的类型. auto a; // 错误,没有初始化表达式,无法推断出a的类型 auto int a = 10; // 错误,auto临时变量的语义在C++ 11中已不存在 auto a = 10; auto c = 'A'; auto s("hello"); vector<int> vctTemp; auto it = vctTemp.begin(); auto ptr = [](){ cout << "

C++11的auto和decltype关键字

今天Mayuyu要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已经就有了auto关键字,只不过在C++98中auto表示的是临时变量的语义,而在C++11中auto表示自动类型推导,如下 auto关键字可以从表达式中推导出变量的类型,这样就大大简化了编程人员的工作.而且auto是在编译时对变量进行了类型推导,所以不会对程序的效率造成影响,另外auto也不会对编译速度造成太大影响,因为编译时本身也要右侧推导后判断是否与左侧匹配. 另外auto在模板编程中也

C++ 11 学习1:类型自动推导 auto和decltype

Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译器并不是完全支持,比如我正在使用的vs2012.这里是msdn里面VS各版本对C++ 11 的支持 对 C++11 功能的支持(现代 C++) 1.auto auto这个关键字C++原先就有,用来指定存储器.因为很少有人去用这个东西,所以在C++11中就把原有的auto功能给废弃掉了,而变成了现在的

关于auto和decltype

1 auto会忽略顶层const,保留底层const 2 3 int i = 0; 4 5 const int* const p = &i; 6 7 auto p2 = p; //p2是const int*,不是const int* const 8 //*p2 = 4; //错误,p指向常量 9 p2 = nullptr; //正确,p2本身不是常量 10 11 12 auto不会保留引用类型,应该使用auto& 13 14 int& x = i; 15 16 auto m = x

c++11 auto 与 decltype 详解

转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值. [cpp] view plain co

C++之auto与decltype

C++11中新增了两种推倒型别的方法,auto和decltype,从而我们的变量定义就方便了很多. 一.auto关键词是根据其初始化物的类型来推导的. (1)推倒时忽略初始化物本身的const属性.如: int x=0; auto a=x,b=0; cout<<typeid(a).name()<<"\t"<<typeid(b).name()<<endl; 输出: i  i(i代表int类型) (2)若为指针或引用,保留其应指涉物的cons

c++11 auto 和 decltype

一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值. 1 //由val_1 和val_2相加的结果可以推断出it

【C++注意事项】5 Top-level const , The auto and decltype Type Specifier

top-level const As we've seen, a pointer is an object that can point to a different object. As a result, we can talk independently about whether a pointer is const and whether the objects to which it can point are const. we use the top-level const to