const 和 constexpr

c++中的constexpr:

  1. 编译时确定和运行时确定: 编译时确定如 const int a  = 3;   运行时确定如 const int b = func();   其中a就是编译时确定,b是运行时确定;

    但是当func()的函数实现是 func(){return 3;},返回的是一个常量值,这个时候如果用const来接收,依然是运行时确定,如果用constexpr来接收这个函数返回值,constexpr int b  = func(); 在编译阶段编译器就可以确定其常量属性。

    constexpr显示的告诉编译器,这个值是常量的。但是如果func的函数内返回的不是常量,constexpr int func(){ return func2(); } func2返回一个变量值,这个时候虽然指定了constexpr,但是确定常量值的时间依然会推迟到运行时。

       constexpr的作用:将常量表达式的常量值信息提前到编译阶段确认。

  2.constexpr修饰的指针表示的是顶层指针,对指针有效。

    3.c++11 指定函数返回值和参数必须保证是字面量,并且只有一个return, 不能是虚函数;c++14 相对于c++11不必保证只有一个retuan;(一个return的函数在复杂情况下可以用三元运算符或者递归计算来返回值)

   const和constexpr修饰变量时:const表达式可以在运行时再确定常量属性,constexpr修饰的表达式在编译器确定常量属性(常量的值)。

   const和constexpr修饰函数时:constexpr函数参数如果不能在编译器确定常量属性,则相当于const

   const和constexpr修饰类时:尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。事实上,一个字面值常量类必须至少提供一个constexpr构造函数。

    constexpr构造函数可以声明成=default的形式(或者是删除函数的形式)。否则,constexpr构造函数就必须既符合构造函数的要求(意味着不能包含返回语句),又符合constexpr函数的要求(意味着它能拥有的唯一可执行语句就是返回语句)。

    综合这两点可知,constexpr构造函数体一般来说应该是空的,因此对函数成员的初始化必须放在初始化列表中。constexpr构造函数必须初始化所有数据成员,constexpr构造函数保证了传递给它的所有参数都是constexpr类型的,产生的对象的所有成员也都是constexpr

 

 

参考地址:

你可能感兴趣的:(const 和 constexpr)