15

constexpr关键字是在 C++11 中引入的,因为(我认为)是“常量表达式”的相应概念。然而,这个概念隐含在 C++98/c++03 中,因为数组声明需要一个常量表达式:

// valid:
int a[sizeof(int)];
int b[3+7];
int c[13/4];
const int n = 3;
int d[n];
// invalid:
int m = 4;
int e[m];

还有其他“常量表达式”,即可以(和/或必须)在编译时评估的表达式;一个例子是模板参数。

对于 C++11 之前的版本,C++98/03 标准或其他地方是否存在以下内容?

  • 需要常量表达式的语法结构的完整列表(例如数组声明和模板实例化)
  • 管理此类常量表达式的规则(大概这只是从上面列表中的项目到标准中的定义的映射)
4

1 回答 1

13

constexpr常量表达式是相关的,因为constexpr告诉我们可以在可以使用常量表达式的地方使用变量或函数。这是 cppreference 告诉我们的:

constexpr 说明符声明可以在编译时计算函数或变量的值。然后可以在仅允许编译时常量表达式的情况下使用此类变量和函数。

常量表达式出现在 C++11 之前,并且在C++03 草案标准中的相同位置涵盖了管理 C++11 之前常量表达式的规则(这是最接近 C++03 的最早的公开草案1作为C++11 标准草案,即5.19 常量表达式部分,cppreference 在常量表达式页面中对此主题进行了很好的总结,但它面向 C++11 和 C++14,很难说出适用于 C+ 之前的内容+11。

标准的 pre C++11 列出了需要常量表达式的地方,在第一段中5.19,它看起来很完整:

在几个地方,C++ 需要计算为整数或枚举常量的表达式:作为数组边界 (8.3.4, 5.3.4),作为 case 表达式 (6.4.2),作为位域长度 (9.6),作为枚举器初始化器(7.2),作为静态成员初始值设定项 (9.4.2),以及作为整数或枚举非类型模板参数 (14.3)。

1段的其余部分说:

整数常量表达式只能涉及算术类型的文字(2.13、3.9.1)、枚举器、非易失性常量变量或整数或枚举类型的静态数据成员,使用常量表达式(8.5)初始化,非类型模板参数整数或枚举类型,以及 sizeof 表达式。浮动文字 (2.13.3) 只有在转换为整数或枚举类型时才能出现。只能使用到整数或枚举类型的类型转换。特别是,除了 sizeof 表达式,不得使用函数、类对象、指针或引用,不得使用赋值、递增、递减、函数调用或逗号运算符。

后面5是列出进一步要求的更多段落。

在 C++11 中,第3段中有一个可以使用常量表达式的列表,但它没有说明在哪里需要它们。您可能必须搜索术语常量表达式才能找到所有需要它的地方,通常会有类似于以下内容的短语:

应该是一个常量表达式

shall是一个重要的术语,因为违反了shall要求会使程序格式错误。

或者,您可以使用Annex A 语法摘要并搜索常量表达式,这应该涵盖语法中需要常量表达式的所有位置,例如:

enumerator = constant-expression

脚注:

  1. 这个答案在哪里可以找到当前的 C 或 C++ 标准文档?有一份完整的标准草案清单。不幸的是,最接近公众可用的是从早期2005。早期版本需要身份验证。据我所知,部分5.19没有太大变化。
于 2014-09-24T19:34:10.923 回答