C++Primer第五版【学习笔记】——auto,decltype【C++11】
2013-03-23 00:12
441 查看
1. auto
我们经常会需要将表达式的值保存在变量中。要声明变量,我们需要知道表达式的类型。但是要确定表达式的类型,有时候是很困难的。C++11新标准引入了auto类型声明符,使变量的类型由编译器通过表达式的推测来确定。比如:auto avalue = value1 + value2;
如果value1和value2为double类型,则avalue为double类型。如果value1和value2为int类型,则avalue也为int类型。
如果使用引用来初始化auto类型,则该变量的类型为引用绑定对象的类型。
int i = 0, &ri = i; auto a = ri; // a的类型为int
auto声明一般会忽略掉顶级(top-level)const,而低级const则会保留。
int i = 0; const int ci = i, &cr = ci; auto b = ci; // b : int auto c = cr; // c : int auto d = &i; // d : int * auto e = &ci; // e : const int *
如果要声明为顶级const,则需要显式定义:
const auto f = ci; // f : const int
当定义一个auto类型的引用时,初始化中的顶级const会保留,因为引用绑定到带const的类型,其实是低级const。
auto &g = ci; // g: const int & auto &h = 42; // error: 不能将普通的引用绑定到一个字面值 const auto &j = 42; // ok: 可以将const引用绑定到字面值 const auto &k = ci; // k : const int &const
2.decltype
有时,我们想将变量的类型定义为某个表达式的类型,但是又不想用该表达式初始化这个变量(auto就是必须初始化)。新规则中引入了类型decltype,来解决这个问题。decltype(f()) dv; //使用函数f()返还值得类型来定义dv
decltype处理top-level const和引用的方法与auto不同,顶级const和引用不会忽略。
const int ci = 0, &rci = ci; decltype(ci) x = 0; // x : const int decltype(rci) y = x; // y : const int & decltype(rci) z; // error, z为const int & 没有初始化
decltype与引用
如果作用于decltype的不是一个变量,则会产生表达式的类型。一些表达式会使decltype产生引用类型。一般来说,当表达式产生的对象可以作为左值(可以出现在赋值语句的左边)时,decltype返回引用类型。
int i = 42, *p = &i, &r = i; decltype(r + 0) b; // ok: addition yields an int decltype(*p) c; // error: c is int & and must be initialized
需要注意的是括号会影响产生的类型:
int i = 0; decltype((i)) d; // error: d is int & and must be initialized decltype(i) e; // ok
decltype((variable))总是返回引用类型。
相关文章推荐
- C++11学习笔记3---auto&decltype
- C++primer第五版第十一章学习笔记
- C++11学习:auto和decltype
- C++primer第五版第六章学习笔记
- C++primer第五版第八章学习笔记
- C++primer(第五版) 第一章 学习笔记
- C++Primer第五版【学习笔记】——第三章 Strings,Vectors,Arrays
- c++ primer 第五版学习笔记-第二章-decltype类型推断
- C++Primer第五版【学习笔记】——第二章 变量和类型
- C++primer第五版第四章学习笔记
- c++11学习笔记之auto
- c++11 学习及测试(auto,decltype,range for...)
- C++学习笔记(五):auto和decltype两个比较神奇的定义变量方法
- C++学习笔记-const对象,类型别名,auto和decltype
- C++Primer学习之三auto和decltype
- C++primer第五版第一章学习笔记
- C++primer第五版第十章学习笔记
- C++primer第五版第九章学习笔记
- C++14学习笔记(4)——decltype(auto)
- C++primer第五版第十二章学习笔记