非Constexpr构造类的Constexpr成员函数

constexpr member function of non constexpr constructible class

本文关键字:Constexpr 成员 函数      更新时间:2023-10-16

如果非文字类类型没有constexpr构造函数(它不是constexpr可构造函数),非静态constexpr成员函数有任何意义吗?我的意思是,如果你不能在编译时构造对象,你怎么能使用它的成员函数呢?

无论如何,主要的编译器不会抱怨它,这使我认为这是标准允许的。

然而,您可以在运行时使用这些constexpr成员函数而没有任何问题。现在唯一的问题是constexpr在这种情况下的影响是什么,如果有的话。我最好的猜测是constexpr成员的返回值是在编译时计算的(如果可能的话),所以在运行时调用它必须做一个简单的复制。

我的猜测是正确的,还是constexpr说明符在这种情况下绝对没有意义(即成员函数在运行时被评估)?

你的问题的前提似乎是只有constexpr函数可以在编译时求值。

这个前提是错误的。编译器可以预先计算任何它能想到的方法,只要产生确切的副作用和副作用(as-if规则)。

constexpr提供的是保证某些表达式将在编译时由每个编译器求值(这不是"实现质量"问题),这使得在需要编译时值的上下文中使用它们成为可能,例如非类型模板参数,switch语句中case子句的操作数等。

关于constexpr函数的具体细节包括,必须至少有一组参数(目标实例是一个隐含参数),这样才能满足constexpr求值规则。如果这不是真的,你的程序是病态的,它的运行时行为根本没有被指定,所以不要在逻辑上不属于它的地方添加constexpr

但是,编译器不需要诊断违反此规则的情况。这意味着"主要编译器不会抱怨它"不应该以任何方式解释为保证代码是正确的。


标准措辞,第7.1.5节(草案n4582)

对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在实参值,使得函数或构造函数的调用可以是求值的子表达式核心常量表达式,或者对于构造函数来说,某个对象的常量初始化项,程序是病态的;不需要诊断。