非constexpr可构造类的constexpr成员函数

时间:2016-10-29 19:00:00

标签: c++ language-lawyer constexpr

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

无论如何,主要的编译器都没有抱怨它,这让我觉得它是标准所允许的。

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

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

1 个答案:

答案 0 :(得分:0)

您的问题的前提似乎是在编译时只能评估constexpr个函数。

这个前提是不正确的。编译器可以预先计算它可以找到的任何方法,只要产生确切的副作用和副作用(如果规则)。

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

围绕constexpr函数的具体细节包括必须至少有一组参数(目标实例是隐含参数),以便满足constexpr评估规则。如果不是这样,那么您的程序格式不正确并且根本没有指定其运行时行为,因此不要将constexpr添加到逻辑上不属于它的位置。

但是,编译器不需要诊断违反此规则的行为。这意味着“主要编译器不会抱怨它”不应该被解释为保证代码是正确的。

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

  

对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是已计算的子表达式   核心常量表达式,或者,对于构造函数,某个对象的常量初始化程序,程序是不正确的;无需诊断。