C++11之auto和decltype
2015-07-16 19:05
507 查看
auto自动类型推断,用于从初始表达式中推断出变量的类型。
auto返回值占位,主要与decltype配合使用,用于返回值类型后置时的占位。
decltype相关用法说明
类似于sizeof操作符,decltype也不需对其操作数求值(而auto会执行表达式)。粗略来说,decltype(e)返回类型前,进行了如下推导:
若表达式e指向一个局部变量、命名空间作用域变量、静态成员变量或函数参数,那么返回类型即为该变量(或参数)的“声明类型”;
若e是一个左值(lvalue,即“可寻址值”),则decltype(e)将返回T&,其中T为e的类型;
若e是一个x值(xvalue),则返回值为T&&;
若e是一个纯右值(prvalue),则返回值为T。
1、表达式根据其值的类型可分为以下三类:
lvalue:左值,即传统意义上的左值。
xvalue(expiring value):x值(中间值?),指通过“右值引用”产生的对象。
这里x可以理解为即将消失(expiring),也可理解为中间(横跨左值和右值)。
prvalue(pure rvalue):纯右值,即传统意义上的右值。
2、两种复合类型:
glvalue(general lvalue):泛左值,由左值和x值构成。泛左值具有动态的类型和对象属性。
rvalue:右值,由x值和纯右值构成。右值具有潜在的可移动性。
3、关于右值引用:
具名右值引用被视为左值。
无名右值引用被视为x值。
对函数的右值引用无论具名与否都将被视为左值。
来自为知笔记(Wiz)
auto a;// 错误,没有初始化表达式,无法推断出a的类型
autoint a =10;// 错误,auto临时变量的语义在C++ 11中已不存在
auto a =10;
auto c ='A';
auto s("hello");
vector<int> vctTemp;
auto it = vctTemp.begin();
auto ptr =[](){ cout <<"hello world"<< endl;};
auto返回值占位,主要与decltype配合使用,用于返回值类型后置时的占位。
template<class T,class U>
autoMultiply(T t, U u)->decltype(t*u)
{
typedefdecltype(t*u)NewType;
NewType*pResult =newNewType(t*u);
return*pResult;
}
decltype相关用法说明
类似于sizeof操作符,decltype也不需对其操作数求值(而auto会执行表达式)。粗略来说,decltype(e)返回类型前,进行了如下推导:
若表达式e指向一个局部变量、命名空间作用域变量、静态成员变量或函数参数,那么返回类型即为该变量(或参数)的“声明类型”;
若e是一个左值(lvalue,即“可寻址值”),则decltype(e)将返回T&,其中T为e的类型;
若e是一个x值(xvalue),则返回值为T&&;
若e是一个纯右值(prvalue),则返回值为T。
1、表达式根据其值的类型可分为以下三类:
lvalue:左值,即传统意义上的左值。
xvalue(expiring value):x值(中间值?),指通过“右值引用”产生的对象。
这里x可以理解为即将消失(expiring),也可理解为中间(横跨左值和右值)。
prvalue(pure rvalue):纯右值,即传统意义上的右值。
2、两种复合类型:
glvalue(general lvalue):泛左值,由左值和x值构成。泛左值具有动态的类型和对象属性。
rvalue:右值,由x值和纯右值构成。右值具有潜在的可移动性。
3、关于右值引用:
具名右值引用被视为左值。
无名右值引用被视为x值。
对函数的右值引用无论具名与否都将被视为左值。
decltype(fun()) sum = x;//sum的类型就是函数fun的返回值类型
constint ci =0,&cj = ci;
decltype(ci) x =0;//x的类型是const int型
decltype(cj) y = x;//y的类型是const int&,y绑定到变量x
decltype(cj) z;//错误,引用类型必须被初始化
int i =42,*p =&i,&r = i;
decltype(r +0) b;//r+0的结果是int型
//通过解引用可以给指针指向的对象赋值,说明解引用操作返回的是引用类型的
decltype(*p) c;//错误,c是int&,必须被初始化
//decltype结果类型与表达式形式密切相关
decltype((i)) d;//错误,d是int&类型,必须初始化
decltype(i) e;//正确,e是一个int类型
来自为知笔记(Wiz)
相关文章推荐
- C++ 类型转换运算符
- C++之构造函数的继承
- C语言--程序设计基础——7、8章
- C++ 必须使用初始化列表
- C++ typeid
- C++全局函数与成员函数的区别
- 对dispatch_async到主线程的逻辑封装成C/C++接口类型
- C++ 连接Mysql数据库
- C++DLL
- 黑马程序员-C语言基础知识-运算符与表达式
- c++.primer.plus第五版第八章编程练习答案
- c++.primer.plus第五版第七章编程练习答案
- C++读取配置文件内中的数组
- C语言获取文件大小
- C++中继承方式对访控属性的影响
- C语言实现修改文本文件中特定行的实现代码
- C语言实现文件复制或者拼接
- C++ STL
- 【C++】基类析构函数为什么要为虚函数
- c语言链表《学习记录》