【发布时间】:2014-11-26 22:14:57
【问题描述】:
作为免责声明,我在询问之前已经对此进行了研究。我找到了a similar SO question,但那里的答案感觉有点“稻草人”,并没有真正为我个人回答这个问题。我还提到了我方便的cppreference page,但大多数时候这并不能提供一个非常“愚蠢”的解释。
基本上,我仍在增加constexpr,但目前我的理解是它需要在编译时评估表达式。由于它们可能仅在编译时存在,因此它们在运行时不会真正具有内存地址。因此,当我看到人们使用 static constexpr(例如在课堂上)时,我会感到困惑……static 在这里是多余的,因为它只对运行时上下文有用。
我在“constexpr 只允许编译时表达式”语句中看到了矛盾(尤其是在 SO)。但是,an article from Bjarne Stroustrup's page 在各种示例中解释说,实际上constexpr 确实 需要在编译时评估表达式。如果不是,则应生成编译器错误。
我的上一段似乎有点离题,但它是理解为什么static 可以或应该与constexpr 一起使用的必要基线。不幸的是,该基线有很多相互矛盾的信息。
谁能帮助我将所有这些信息整合成纯粹的事实,并提供有意义的示例和概念?基本上除了了解constexpr 的实际行为方式之外,为什么还要使用static 呢? static constexpr 在哪些范围/场景下有意义,如果它们可以一起使用?
【问题讨论】:
-
“由于它们可能只存在于编译时,它们在运行时不会真正拥有内存地址。” 它们的行为(可以行为)就像
const对象在运行时。 -
constexprfor variables 要求初始化程序在编译时可评估,以便变量本身可以在必须在编译时评估/评估的上下文中使用。变量的类型将隐式变为const。我想就是这样。 -
@dyp 如果它们在运行时可以表现得像 const ,那么这在哪里记录?你能找到任何来源吗(C++11 草案会很好,我在其中找不到相关文本)
-
[dcl.constexpr]小节主要定义了constexpr说明符的行为。例如,[dcl.constexpr]/9(在 N3797 中)表示“对象声明中使用的constexpr说明符将对象声明为const。”包含constexpr的变量声明基本上是对象的普通声明,但有一些附加规则。 -
+1 由于 Bjarne 和 Herb 等专家所说的与标准实际保证的内容之间的冲突,这个问题的答案有些复杂。这在我的answer here, which is also on constexpr 的cmets 中得到了很好的证明。我的感觉是这需要一点时间才能弄清楚,我花了很多时间试图收集有关 C++11/14 良好实践的详细信息,尽管有一些很好的资源,但在某些主题上可能很困难。跨度>