我正在编写constrexpr函数,使用CArray T(&)(N)
或std::array
。
我想我必须写两个函数(如果你知道的话我会很高兴知道),
但是我关心用std :: array
写的东西 constexpr float LinInterp01(const std::array<float, N>& inArray, float inX);
编写constrexpr函数以传递const&amp;时是否正确?或不?
我认为应该是因为在编译时编译器会实例化一个副本,并且在编译时没有L值的概念。
有人能解释一下吗?
答案 0 :(得分:1)
C ++标准部分§7.1.5[dcl.constexpr]
constexpr函数的定义应满足以下约束条件:
- 它不应是虚拟的(10.3);
- 其返回类型应为文字类型;
- 每个参数类型都应为文字类型;
第3.9节[basic.types]
类型是文字类型,如果它是:
- 无效;或
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型(第9节):
- 它有一个简单的析构函数,
- 它是聚合类型(8.5.1)或至少有一个constexpr构造函数或构造函数模板 这不是复制或移动构造函数,
- 它的所有非静态数据成员和基类都是非易失性文字类型。
所以是,您可以通过参考constexpr
函数传递参数。
现在是否在编译时实际评估函数调用取决于LinInterp01
的正文和调用。