我正在使用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() }
} };
它确实非常明确(我假设“数组”确实是“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。