文章目录
类型说明符
- auto:用于从初始化表达式中推断出变量的数据类型。auto定义的变量必须有初始值。
auto a = 10;//typeid(a).name()==int
auto b ;// err
- decltype:用于选择并返回操作数的数据类型。编译时类型推导,以一个普通表达式为参数,返回该表达式类型,并不会对该表达式求值
int a = 1;
decltype(a) b;
decltype((a))b;//err
decltype((a)) b = a;
注意:
- 如果decltype使用的是一个不加括号的变量,得到的就是该变量的类型。
- 如果给变量加上了一层括号,编译器会把它当作一个表达式,得到的则是引用类型。
空指针nullptr
C++11 引入了 nullptr 关键字,专门用来区分空指针、0。
constexpr
- constexpr变量
将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,必须在编译期间计算出它的值并且它的值不可以被改变(VS2010目前不支持)
int a = 3;
int b = 4;
scanf("%d", &a);
constexpr int value1 = a + b;//编译器报错,表达式a + b不是常量表达式
const int value2 = a + b;//正常初始化,不会报错
- constexpr函数
可以实现编译期函数:即函数在编译期执行完毕,并在调用处进行替换
规定:
- 函数的返回值以及参数都必须为字面值类型;
- 函数只能有一条return语句(C++14后无该要求);
- 函数不一定返回常量表达式,但如果要初始化一个constexpr变量,则必须返回常量表达式(参数也必须为常量或常量表达式);
- 函数被隐式的声明为内联函数;
- 函数内部可以声明变量(声明之后是运行期还是编译期?),可以用using声明,空语句,类型别名,循环,判断语句等,但cout不行。
举例:
#include <iostream>
using namespace std;
//运算n的阶乘
constexpr int factorial(int n)
{
return n == 0 ? 1 : n * factorial(n - 1);
}
int main()
{
cout << factorial(10) << endl;
system("pause");
return 0;
}
noexcept
-
在C++11中,声明一个函数不可以抛出任何异常使用关键字noexcept(VS2010目前不支持) 。
-
编译器不会在编译时检查noexcept的说明,如果一个函数在说明了noexcept的同时又含有throw语句,编译器将顺利编译通过,并不会因为这种违反异常说明的情况而报错。
基于范围的 for 循环
简化了常见的循环,对数组或容器类等的每个元素执行相同的操作
for (auto x : xxx) {
}
初始化列表
#include <initializer_list>
class Magic {
public:
Magic(std::initializer_list<int> list) {
}
};
Magic magic = {
1,2,3,4,5};
std::vector<int> v = {
1, 2, 3, 4};
模板增强
- 类型别名:使用using关键字更加直观的定义别名
typedef int (*fun)(int *); //以前c++的做法,声明一个参数为`int *`,返回值为int的函数指针,名字叫fun
using fun = int (*)(int *); //c++11ÿ