如果非literal类类型没有constexpr
构造函数(它不是constexpr
可构造的),那么非静态constexpr
成员函数是否有意义?我的意思是如果你不能在编译时构造对象,你将如何使用它的成员函数?
无论如何,主要的编译器都没有抱怨它,这让我觉得它是标准所允许的。
然而,您可以在运行时使用此类constexpr
成员函数而不会出现任何问题。现在唯一的问题是constexpr
在这种情况下的影响是什么,如果有的话。 我最好的猜测是constexpr
成员的返回值正在编译时进行评估(如果可能的话),因此在运行时调用时,它必须做一个简单的复制。
我的猜测是正确的,还是constexpr
说明符在这种情况下绝对没有意义(即成员函数在运行时被评估)?
答案 0 :(得分:0)
您的问题的前提似乎是在编译时只能评估constexpr
个函数。
这个前提是不正确的。编译器可以预先计算它可以找到的任何方法,只要产生确切的副作用和副作用(如果规则)。
constexpr
提供的是保证某些表达式将在编译时由每个编译器进行评估(它不是“实现质量”问题),这使得在需要编译时值的上下文中使用它们,例如非类型模板参数,case
语句中switch
子句的操作数等。
围绕constexpr
函数的具体细节包括必须至少有一组参数(目标实例是隐含参数),以便满足constexpr
评估规则。如果不是这样,那么您的程序格式不正确并且根本没有指定其运行时行为,因此不要将constexpr
添加到逻辑上不属于它的位置。
但是,编译器不需要诊断违反此规则的行为。这意味着“主要编译器不会抱怨它”不应该被解释为保证代码是正确的。
标准的措辞,第7.1.5节(草案n4582)
对于既不是默认也不是模板的
constexpr
函数或constexpr
构造函数,如果不存在参数值,则函数或构造函数的调用可以是已计算的子表达式 核心常量表达式,或者,对于构造函数,某个对象的常量初始化程序,程序是不正确的;无需诊断。