一、constexpr
C++一直有常量表达式的概念,即在编译器求值的表达式。在某些情况下必须使用常量表达式。例如,定义数组时,数组的大小需要为常量表达式。由此限制,以下代码在C++中无效。
const int getArraySize(){ return 32; }
int main (){
int myArray[getArraySize()];//错误
}
使用constexpr(允许constexpr函数调用其他constexpr函数,但补允许调用任何非constexpr函数。这样的函数不允许有任何副作用,也不能引发异常)。
constexprint getArraySize(){ return 32; }
int main (){
int myArray[getArraySize()];//正确
}
通过定义constexpr构造函数,可以创建用户自定义类型的常量表达式变量。
class Rect
{
public:
constexpr Rect(size_t width, size_t height)
:m_width { width }, m_height { height }
constexpr size_t getArea() const { return m_width * m_height ;}
private:
size_t m_width { 0 }, height { 0 };
}
constexpr Rect r { 8, 2 };
int myArray[r.getArea()];//ok
二、consteval
constexpr关键字指定函数可以在编译期执行,但不能保证一定在编译期执行,
constexpr double inchTomm(double inch) { return inch * 25; }
constexpr double const_inch { 6.0 };
constexpr double mm1 { inchTomm(const_inch) };//编译期执行
double inch { 6.0 };
constexpr double mml2 { inchTomm(inch ) };//运行期间执行
如果确实希望保证始终在编译期间对函数进行求值,则需要使用C++20的consteval关键字将函数转换为所谓的立即函数。
consteval double inchTomm(double inch) { return inch * 25; }
constexpr double const_inch { 6.0 };
constexpr double mm1 { inchTomm(const_inch) };//编译期执行
double inch { 6.0 };
constexpr double mml2 { inchTomm(inch ) };//编译错误