c++ - 如何正确声明常量表达式?

标签 c++ compiler-errors constants

我正在阅读The C++ Programming Language并尝试理解常量。书上说这是有效的:

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);
}

关于c++ - 如何正确声明常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733749/

相关文章:

c - 编译第三方库时指向无效错误的指针的算法

c++ - 这段代码有什么错误,请帮助:

objective-c - 在 Xcode 中导致链接器错误的 Const 声明

c++ - 使用 const 成员放置 new 和类的赋值

c++ - 为什么我会看到此消息 "library not found for -lboost_system"?

c++ - 异常后返回的对象?

C++ - 我的脚本在 SRC 中吗?

c - 我的头文件有什么问题?

c++ - 使用 const 成员分配类

java - C++ 引用和 Java 引用