переменная constexpr должна быть инициализирована константным выражением - PullRequest
0 голосов
/ 27 апреля 2020

Я программирую на C ++ Builder 10.3 от Embarcadero Technology, которая использует компилятор c ++ 17. Я не писал код ниже, и он немного сложнее, чем я привык работать. Я никогда не использовал constexpr раньше.

В нижней части кода ниже, когда компилятор нажимает: "массив constexpr g_PERT_S1" он выдает ошибку "переменная constexpr 'g_PERT_S1' должна быть инициализирована константным выражением. Функция non-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 Ответ

0 голосов
/ 28 апреля 2020

Это действительно довольно явно (я предполагаю, что «массив» действительно является «std :: array»
https://en.cppreference.com/w/cpp/container/array,

, и что у вас где-то используется пространство имен std. ..

constexpr g_PERT_S1 может принимать только то, что построено с constexpr.

, поэтому один из g_PERT_S1_1 - g_PERT_S1_4 не является constexpr.

Но, как указано в комментарии, Ваш пример не завершен, поскольку у нас нет этих 4 определений.

Функция-член size () is и data () в std :: array является constexpr в C ++ 17, но, очевидно, она возвратит constexpr только если массив является constexpr.

...