【发布时间】:2014-11-19 10:06:52
【问题描述】:
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 标准或其他地方是否存在以下内容?
- 需要常量表达式的语法结构的完整列表(例如数组声明和模板实例化)
- 管理此类常量表达式的规则(可能只是从上述列表中的项目到标准中的定义的映射)
【问题讨论】:
-
@wallyk 因为这是真的。
-
@KonradRudolph 编译器扩展的礼物,令人惊讶的是有多少 C++ 开发人员不知道这一点。
-
@wallyk 一些编译器允许在堆栈上使用可变大小的数组,但通常会发出警告。
-
@MoreAxes 通常它需要正确的标志来接收警告,对于
gcc和clang,这将是-pedantic。 -
@ShafikYaghmour 确实!当我把这些例子放在一起时,当我发现我可以在没有警告或错误的情况下编译
int e[m];(使用g++)时,我一度感到困惑。
标签: c++ c++03 c++98 compile-time-constant constant-expression