C++11 之前的"Constant expressions"

"Constant expressions" prior to C++11

本文关键字:Constant expressions C++11      更新时间:2023-10-16

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标准中或其他地方是否存在以下内容?

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

constexpr和常量表达式是相关的,因为constexpr告诉我们,可以使用变量或函数,其中可以使用常数表达式

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

常量表达式在C++11之前就已经存在,并且在C++03标准草案中的同一位置涵盖了C++11之前常量表达式的管理规则(这是最早的最接近C++03的公共草案1作为C++11标准草案CCD_,cppreference在Constant expressions页面中对这个主题有一个很好的总结,但它面向C++11和C++14,很难说什么适用于C++11之前的版本。

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

在某些地方,C++需要计算为积分或枚举常数:作为数组边界(8.3.4,5.3.4)、作为事例表达式(6.4.2)、位字段长度(9.6)、作为枚举器初始化器(7.2)、作为静态成员初始化器(9.4.2),以及作为积分或枚举非类型模板参数(14.3)

1段的其余部分说:

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

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

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

应为常数表达式

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

或者,您可以使用Annex A语法摘要并搜索常量表达式,这应该涵盖语法中需要常数表达式

enumerator = constant-expression

脚注:

  1. 这个问题的答案是:我在哪里可以找到当前的C或C++标准文档?有一个完整的标准草案列表。不幸的是,最接近公众的是早期2005。早期版本需要身份验证。据我所知,5.19部分没有太大变化