一.nullptr
示例:
#include <iostream> |
foo(NULL)无法编译通过,因为编译器不知道NULL隐式转换为哪个类型的参数来调用。
所以,当需要使用 NULL 时候,请养成直接使用 nullptr 的习惯。
二.constexpr
C++11新标准规定,允许将变量或函数声明为constexpr类型,由编译器来验证变量的值是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化
1.constexpr修饰函数
constexpr int sub(int i) |
2.constexpr修饰类
constexpr可以修饰类的构造函数
即:保证传递给该构造函数的所有参数都是constexpr,那么产生的对象的所有成员都是constexpr。
该对象也是constexpr对象了,可用于只使用constexpr的场合。
**注意**constexpr构造函数的函数体必须为空,所有成员变量的初始化都放到初始化列表中。
class Test |
3.constexpr递归函数
constexpr int fibonacci(const int n) |
从 C++14 开始,constexptr 函数可以在内部使用局部变量、循环和分支等简单语句
例如下面的代码在 C++11 的标准下是不能够通过编译的
constexpr int fibonacci(const int n) |
4.使用constexpr的好处
- 很强的约束,保证程序的正确定义不被破坏;
- 编译器对constexper代码进行了优化,例如:将用到的constexpr表达式直接替换成结果;
- 相比宏来说没有额外的开销。