如何正确声明常量表达式

How to declare a constant expression correctly?

本文关键字:表达式 常量 声明 何正确      更新时间:2023-10-16

我正在阅读《c++编程语言》,并试图理解Constants。书上说这是有效的:

const int dmv = 17; // dmv is a named constant
constexpr double max1 = 1.4∗square(dmv); // OK if square(17) is a constant expression

但是当我这样做的时候:

constexpr double square(double x)
{
    return x * x;
}
int main()
{ 
    const double x = 40.0;
    constexpr double result = 1.2 + square(x);
}

有两个错误:

  1. 表达式必须具有恒定值(在x中,如果我将其替换为12.4(如square(12.4))的值,则错误消失)
  2. 函数调用必须在常量表达式中有一个常量值(在square方法调用中)

这些错误的原因是什么?我错过了什么?

在c++ 11之前,constexpr不存在,编译时算术只能用于整数类型(或多或少)。

在该语言中,使const int"变量"在任何可能的情况下都是真正的常量是有意义的,而对于const double则不是这样。

c++ 11引入了constexpr,因此不再需要const T变量的特殊规则,但是删除该规则将不必要地破坏现有代码。c++ 11还引入了编译时浮点运算,但由于const double变量以前从未被视为常量表达式,现在更改它也没有什么好处,因此需要显式地说constexpr

constexpr double square(double x)
{
  return x * x;
}
int main()
{ 
  constexpr double x = 40.0;
  constexpr double result = 1.2 + square(x);
}