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就会得到引用类型:
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暂时不支持.