constexpr变量必须通过一个常量表达式来初始化。

问题描述 投票:0回答:1

我是用Embarcadero Technology公司的C++Builder 10.3来编程的,它使用的是c++17编译器。下面的代码不是我写的,它比我习惯的工作要复杂一些。我以前从未使用过constexpr。

在下面的代码底部,当编译器打出 "constexpr array g_PERT_S1 "时,它给出了错误 "constexpr变量'g_PERT_S1'必须由一个常量表达式初始化,非constexpr函数'data'不能用于常量表达式array(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() }
} };
c++ c++14
1个回答
0
投票

它确实很明确(我假设 "array "确实是 "std::array" https:/en.cppreference.comwcppcontainerarray。 ,

而且你在某个地方有一个使用命名空间std的地方......

constexpr g_PERT_S1 只能接受用 constexpr 构建的东西......所以 g_PERT_S1_1 至 g_PERT_S1_4 中的一个不是 constexpr。

所以g_PERT_S1_1到g_PERT_S1_4中的一个不是constexpr。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.