【发布时间】:2015-11-30 13:20:43
【问题描述】:
给定两个程序,其中源代码的唯一区别是存在或不存在一个constexpr,程序的含义是否可能改变?
换句话说,如果有一个编译器选项要求编译器在可能的情况下非常努力地推断constexpr,它会破坏现有的标准代码和/或以不好的方式改变其含义吗?
想象一下处理一个代码库,其中原始开发人员忘记在可能的地方包含constexpr,可能是在 C++11 之前编写的代码。如果编译器能够推断出constexpr 来帮助您继续工作,那就太好了。当然,也许它还应该在每次执行此推断时发出警告,鼓励您稍后显式添加constexpr。但它仍然很有用。我担心它可能会破坏东西?
到目前为止,我唯一能想到的是 constexpr 函数隐含地是 inline 并且在某些情况下添加 inline 会以不好的方式改变事情;例如,如果您违反了单一定义规则。
【问题讨论】:
-
好吧,例如,如果编译器供应商选择将标准中未标记的函数标记为 constexpr,这可能会通过 SFINAE 导致不同的行为,这就是最终不允许这样做的原因,请参阅 Is it a conforming compiler extension to treat non-constexpr standard library functions as constexpr?跨度>
-
感谢@ShafikYaghmour。我用 SFINAE 做了一些实验,试图找到分歧,但我做不到。我想我的例子太简单了:)
-
我有一个an example here where SFINAE breaks,原因是对常量表达式中未定义行为的不同处理。我仍然没有答案,这是否被认为是符合要求的。不完全相同,但我们可以看到不同的实现如何破坏 SFINAE。
-
一个推断
constexpr的编译器应该,根据定义,只在不改变行为的情况下这样做。 -
@Jens 是的,但他们必须遵守 as-if 规则。