提问者:小点点

Constexpr变量必须由常量表达式初始化


我正在使用Embarcadero Technology的C Builder 10.3进行编程,它使用c 17编译器。我没有编写下面的代码,它比我习惯使用的要复杂一点。我以前从未使用过constexpr。

在下面的代码底部,当编译器命中时,“constexpr数组g_PERT_S1”它会给出错误“constexpr变量'g_PERT_S1'必须由常量表达式初始化。非constexpr函数'data'不能在常量表达式数组(226)中使用:此处声明“您能否建议更改代码以解决此错误。

struct AAPLUS_EXT_CLASS ELPMPP02PertubationsCoefficient
{
  double m_S;
  double m_C;
  array<int, 13> m_I;
};

constexpr array<ELPMPP02PertubationsCoefficient, 2> g_PERT_S3_4
{ {
 { -5.458720424980e-07,  2.801517894073e-07, {   0,   0,   2,   0,   0, -18,  16,   0,   0,   0,   0,   0,   0 } },
 { -5.121329506146e-07, -2.627345838573e-07, {   0,   0,   0,   0,   0,  18, -16,   0,   0,   0,   0,   0,   0 } }
} };


struct AAPLUS_EXT_CLASS ELPMPP02Pertubations
{
  const ELPMPP02PertubationsCoefficient* m_pTable;
  size_t m_nTableSize;
};


/*constexpr variable 'g_PERT_S1' must be initialized by a constant expression
non-constexpr function 'data' cannot be used in a constant expression array(226): declared here*/

constexpr array<ELPMPP02Pertubations, 4> g_PERT_S1  /*ERROR HERE*/
{ {
  { g_PERT_S1_1.data(), g_PERT_S1_1.size() },
  { g_PERT_S1_2.data(), g_PERT_S1_2.size() },
  { g_PERT_S1_3.data(), g_PERT_S1_3.size() },
  { g_PERT_S1_4.data(), g_PERT_S1_4.size() }
} };

共1个答案

匿名用户

它确实非常明确(我假设“数组”确实是“std::array”
https://en.cppreference.com/w/cpp/container/array,

并且您在某处有一个使用命名空间std…

Constexprg_PERT_S1只能接受使用Constexpr构建的东西。

所以g_PERT_S1_4的g_PERT_S1_1之一不是constexpr。

但正如评论中所指出的,您的示例并不完整,因为我们没有这4个定义。

std::array的size()is和data()成员函数在C 17中是constexpr,但很明显,只有当数组是constexpr时,它们才会返回一个constexpr。

相关问题