Вам не нужна дополнительная переменная, просто напишите:
static auto window = init_array<windowSize, -1>();
Инициализатор все еще является константным выражением и должен оцениваться компилятором во время компиляции.
Если ваш компилятор не оптимизирует это должным образом по какой-то причине, тогда вы можете использовать лямбду для хранения промежуточной переменной constexpr
:
static auto window = []{ constexpr auto x = init_array<windowSize, -1>(); return x; }();
или вы можете поместить ее в отдельную функцию, например в init_array
:
template <size_t sz, int value>
constexpr std::array<int, sz> init_array()
{
constexpr auto x = []{
std::array<int, sz> arr{};
//arr.fill(-1); // will be constexpr since C++20
// operator [] is constexpr in C++17
for (int i = 0; i < sz; ++i)
arr[i] = value;
return arr;
}();
return x;
}
Вы можете сделать функцию гораздо более обобщенной c:
template <std::size_t S, typename T>
constexpr auto init_array(const T& value)
{
return std::apply([&](auto... pack){
return std::array{((void)pack, value)...};
}, std::array<int, S>{});
}
, используемой как
static auto window = init_array<windowSize>(-1);
или
template <std::size_t S, auto value>
constexpr auto init_array()
{
constexpr auto x = std::apply([](auto... pack){
return std::array{((void)pack, value)...};
}, std::array<int, S>{});
return x;
}
используется как
static auto window = init_array<windowSize, -1>;
для принудительной оценки времени компиляции (вплоть до копирования).