您的位置:首页 > 编程语言 > C语言/C++

C++ 11 新标准学习记录2

2014-01-01 23:11 211 查看
1.nullptr, c++11 引入,nullptr是一种特殊类型的字面值.

int *p1= nullptr;

2.constexpr, c++11 允许将变量声明为constexpr类型以便由编译来验证变量的值是否是

一个常量表达式.

vs2012  sp3 暂不支持.

3.atuo, c++11 引入auto 类型说明符,能让编译器去分析表达式所属的类型。auto定义的

变量必须有初始值:

auto item = val1 + val2; //由val1 + val2的结果推断出item的类型 

auto一般会忽略掉顶层const,同时底层const会被保留下来:

const int ci = i, &cr = ci;

auto b = ci; //b是一个整数,ci的顶层const被忽略.

auto c = cr; //c是一个整数

auto d = &i; d是一个整形指针

auto e = &ci; //e是一个指向整数常量的指针, 对常量对象取地址是一种底层const.

4.decltype, c++11引入的第二种类型说明符,它的作用是选择并返回操作数的数据类型,在

此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值:

decltype(f()) sum = x;

编译器并不实际调用函数f,
 而是用当调用f()时返回的类型做为sum的类型.

decltype处理顶层const 和引用的方式与auto不同.

const int ci = 0, &cj = ci;

decltype(ci) x = 0; //正确 x 为const int

decltype(cj) y = x; //正确,y是const int& 

decltype(cj) z = x; // 错误,z是引用,必须初始化

//decltype的结果可以是引用类型

int i = 42, *p = &i;  &r = i;

decltype(r + 0)  b;  //b是一个未初化的int

decltype(*p) c;  //错误,c是int&,必须初始化. 如果表达式的内容是解引用操作,则decltype将得到引用类型。decltype(*p)的结果类型是int&, 而非int.

还有一处与auto的重要区别,对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同,如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型vk果给变量加上了一层或多层括号,编译器就会把它当成是一个表达式。变量是一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型:

decltype((i)) e; //e是int&,必须初始化.

关于类内初始值,经测试,vs2012暂时不支持.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++11 c++ vs2012