码迷,mamicode.com
首页 > 编程语言 > 详细

C++11之auto和decltype

时间:2015-07-16 21:26:27      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

  • auto自动类型推断,用于从初始表达式中推断出变量的类型。
  1. auto a; // 错误,没有初始化表达式,无法推断出a的类型
  2. auto int a = 10; // 错误,auto临时变量的语义在C++ 11中已不存在
  3. auto a = 10;
  4. auto c = ‘A‘;
  5. auto s("hello");
  6. vector<int> vctTemp;
  7. auto it = vctTemp.begin();
  8. auto ptr = [](){ cout << "hello world" << endl; };
  • auto返回值占位,主要与decltype配合使用,用于返回值类型后置时的占位。
  1. template <class T, class U>
  2. auto Multiply(T t, U u)->decltype(t*u)
  3. {
  4. typedef decltype(t*u) NewType;
  5. NewType *pResult = new NewType(t*u);
  6. return *pResult;
  7. }
decltype相关用法说明
类似于sizeof操作符,decltype也不需对其操作数求值(而auto会执行表达式)。粗略来说,decltype(e)返回类型前,进行了如下推导:
  1. 若表达式e指向一个局部变量、命名空间作用域变量、静态成员变量或函数参数,那么返回类型即为该变量(或参数)的“声明类型”;
  2. 若e是一个左值(lvalue,即“可寻址值”),则decltype(e)将返回T&,其中T为e的类型;
  3. 若e是一个x值(xvalue),则返回值为T&&;
  4. 若e是一个纯右值(prvalue),则返回值为T。
     

1、表达式根据其值的类型可分为以下三类:

  • lvalue:左值,即传统意义上的左值。
  • xvalue(expiring value):x值(中间值?),指通过“右值引用”产生的对象。
                                     这里x可以理解为即将消失(expiring),也可理解为中间(横跨左值和右值)。
  • prvalue(pure rvalue):纯右值,即传统意义上的右值。
2、两种复合类型:
  • glvalue(general lvalue):泛左值,由左值和x值构成。泛左值具有动态的类型和对象属性。
  • rvalue:右值,由x值和纯右值构成。右值具有潜在的可移动性。
3、关于右值引用:
  • 具名右值引用被视为左值。
  • 无名右值引用被视为x值。
  • 对函数的右值引用无论具名与否都将被视为左值。
  1. decltype(fun()) sum = x;//sum的类型就是函数fun的返回值类型
  2. const int ci = 0, &cj = ci;
  3. decltype(ci) x = 0; //x的类型是const int型
  4. decltype(cj) y = x; //y的类型是const int&,y绑定到变量x
  5. decltype(cj) z;//错误,引用类型必须被初始化
  6. int i = 42, *p = &i, &r = i;
  7. decltype(r + 0) b; //r+0的结果是int型
  8. //通过解引用可以给指针指向的对象赋值,说明解引用操作返回的是引用类型的
  9. decltype(*p) c;//错误,c是int&,必须被初始化
  10. //decltype结果类型与表达式形式密切相关
  11. decltype((i)) d;//错误,d是int&类型,必须初始化
  12. decltype(i) e;//正确,e是一个int类型





C++11之auto和decltype

标签:

原文地址:http://www.cnblogs.com/fengkang1008/p/4652221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!