[dcl.]c++标准中的Constexpr]p5
Rationale for [dcl.constexpr]p5 in the c++ standard
[dcl. cn]的基本原理是什么?constexpr] p5 (http://eel.is/c + +/dcl.constexpr # 5)草案?
对于非模板、非默认的constexpr函数或非模板、非默认、非继承constexpr构造函数不存在任何参数值,使得函数的调用或构造函数可以是核心常量的求值子表达式表达式([expr.const]),对于构造函数,则为常量对于某个对象([basic.start.init])的初始化器,程序是不规范的;不需要诊断。
如果程序违反了这条规则,声明违反规则的函数constexpr是无用的。那又怎样?接受对decl-specifier constexpr的无用使用,而不是触发未定义的行为(不需要诊断),这不是更好吗?除了未定义行为的问题外,我们还遇到了规则[dcl]的额外复杂性。
在某些情况下,实现仍然可以提供它能够检测到的有用的诊断消息(按照约定的警告)。就像下面的例子:
int main() { 0; }
main中的表达式格式良好,但无用。有些编译器无论如何都会以警告的形式发出诊断消息(并且它们被允许这样做)。
我明白[dcl]。p5不需要诊断,所以我不是在问这个。
它是病态的原因是使它病态的允许实现拒绝不可能形成常量表达式的constexpr
函数定义。尽早拒绝它们意味着得到更有用的诊断。
不需要诊断的原因是,对于一个实现来说,要确定对于每一个可能的参数组合,结果都不是一个常量表达式,这可能是不现实的。
事实上,不需要诊断,实际上意味着使行为未定义对我来说似乎是不幸的,但只是因为缺乏更好的选择而被选中。如果意图实际上是允许任何任意的运行时行为,我会非常惊讶,但是对于c++中的任何语言特性都没有"可能被诊断为错误,但如果不是,必须按照指定的方式行事"的概念。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- [dcl.]c++标准中的Constexpr]p5