非Constexpr构造类的Constexpr成员函数
constexpr member function of non constexpr constructible class
如果非文字类类型没有constexpr
构造函数(它不是constexpr
可构造函数),非静态constexpr
成员函数有任何意义吗?我的意思是,如果你不能在编译时构造对象,你怎么能使用它的成员函数呢?
无论如何,主要的编译器不会抱怨它,这使我认为这是标准允许的。
然而,您可以在运行时使用这些constexpr
成员函数而没有任何问题。现在唯一的问题是constexpr
在这种情况下的影响是什么,如果有的话。我最好的猜测是constexpr
成员的返回值是在编译时计算的(如果可能的话),所以在运行时调用它必须做一个简单的复制。
我的猜测是正确的,还是constexpr
说明符在这种情况下绝对没有意义(即成员函数在运行时被评估)?
你的问题的前提似乎是只有constexpr
函数可以在编译时求值。
这个前提是错误的。编译器可以预先计算任何它能想到的方法,只要产生确切的副作用和副作用(as-if规则)。
constexpr
提供的是保证某些表达式将在编译时由每个编译器求值(这不是"实现质量"问题),这使得在需要编译时值的上下文中使用它们成为可能,例如非类型模板参数,switch
语句中case
子句的操作数等。
关于constexpr
函数的具体细节包括,必须至少有一组参数(目标实例是一个隐含参数),这样才能满足constexpr
求值规则。如果这不是真的,你的程序是病态的,它的运行时行为根本没有被指定,所以不要在逻辑上不属于它的地方添加constexpr
。
但是,编译器不需要诊断违反此规则的情况。这意味着"主要编译器不会抱怨它"不应该以任何方式解释为保证代码是正确的。
标准措辞,第7.1.5节(草案n4582)
对于既不是默认也不是模板的
constexpr
函数或constexpr
构造函数,如果不存在实参值,使得函数或构造函数的调用可以是求值的子表达式核心常量表达式,或者对于构造函数来说,某个对象的常量初始化项,程序是病态的;不需要诊断。
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 初始化模板化类中的静态 constexpr 成员
- 静态 constexpr 成员变量初始化
- 使用静态 constexpr 成员的未解析外部符号
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- Constexpr成员函数
- 在模板定义中调用非静态constexpr成员函数
- 在构造函数中使用 constexpr 成员
- emplace_back会导致静态 constexpr 成员上出现链接错误
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 通过呼叫constexpr函数来定义静态constexpr成员
- constexpr:constexpr成员的定义和声明
- 在定义(.cpp文件)中初始化静态浮点 constexpr 成员是可能的
- Clang声称通用lambda参数的constexpr成员不是constexpr
- C 私有静态constexpr成员变量
- constexpr 成员函数,C++中的 std::向量数据成员
- 跨编译器的 constexpr 成员函数的重载解析不一致
- 对静态 constexpr 成员的未定义引用仅由值使用
- 将模板结构用作模板参数与静态constexpr成员
- 从成员变量访问静态 constexpr 成员,GCC 错误?