2014-09-24 79 views
13

constexpr关键字是在C++ 11中引入的,因为(我认为)是“常量表达式”的相应概念。然而,这种概念被隐式地呈现在C++ 98/C++ 03中,由于数组声明需要恒定的表达式:C++ 11之前的“常量表达式”

// 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]; 

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

对于pre-C++ 11,在C++ 98/03标准或其他地方是否存在以下情况?

  • 要求常量表达式(例如数组声明和模板实例)的语法结构的完整列表
  • 管辖这些常量表达式的规则(大概这也只是从上述列表中,以它们的定义的项目的映射在标准)
+0

等一下!“数组声明需要*常量*表达式”?你为什么这么说? – wallyk 2014-09-24 20:14:49

+4

@wallyk因为这是真的。 – 2014-09-24 20:15:41

+1

@KonradRudolph是编译器扩展的礼物,很多C++开发人员不知道这一点令人惊讶。 – 2014-09-24 20:17:56

回答

12

constexpr在该constexpr相关的常量表达式告诉我们,一个变量或函数可以使用其中可以使用常数表达。这是cppreference告诉我们:

的constexpr指定符,它可以评估在编译时函数或变量的值 。这些变量和 函数可以用于只允许编译时间常数 表达式的地方。

恒expresions存在之前C++ 11和管辖常量表达式预先C++ 11的规则被覆盖在C++03 draft standard同一个地方(这可用最接近最早公开草案至C + +03)为draft C++11 standard这是部分5.19常量表达式,cppreference对这个话题了很好的总结在Constant expressions页,但它向C++ 11和C++ 14齿轮,它很难说适用于Pre-C++ 11。

在需要恒定表达,在5.19第一段的标准预C++ 11列出,它看起来完整:

在好几个地方,C++要求评估到 整型或枚举表达式常数:作为数组表达式(8.3.4, 5.3.4),作为表达式(6.4.2),位长度(9.6),作为枚举器初始值设定项(7.2),作为静态成员初始值设定项(9.4.2) , 和整型或枚举非类型模板参数(14.3)。

段落的其余部分说:

的积分常数表达式可以涉及 算术类型(2.13,3.9的只有文字。1),枚举数,非易失性const 变量或整型或枚举类型的静态数据成员 用常量表达式(8.5)初始化,非类型模板 整型或枚举类型的参数以及sizeof表达式。 浮点文字(2.13.3)只有在转换为 整型或枚举类型时才会出现。只能将类型转换为整数或者枚举类型为 。尤其是,除了sizeof 表达式,函数,类对象,指针或引用不应使用,并且不得使用逗号分配,逗号,递增,递减,函数调用或逗号运算符。

后面跟着5更多的段落列出了更多的要求。

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

应是常量表达式

是重要的术语,因为违反了应该要求使得程序不合格。

或者您可以使用Annex A语法总结和搜索常量表达式,并应覆盖所有的语法在需要常量表达式的地方,例如:

enumerator = constant-expression 

脚注:

  1. 这个answer to Where do I find the current C or C++ standard documents?有一个完整的标准草案清单。不幸的是,最接近公众的是从早期的2005。早期版本需要认证。据我所知,5.19段没有太大变化。
+0

您链接到的标准草案是从2005年开始的......是真的用于'C++ 03'吗? – 2014-09-24 20:01:13

+0

@KyleStrand它是最早的公共草案标准可用,你可以找到一个完整的草案清单可供所有[这里](http://stackoverflow.com/questions/81656/where-do-i-find-the-current -C-或-C标准的文档)。 – 2014-09-24 20:02:31