Хочется заполнить constexpr std::array на стадии компиляции, но clang 4.0 с флагом -std=c++1z ругается:
non-constexpr function 'operator[]' cannot be used in a constant expression
lookupTable[i] = f(i);
Какой тогда толк от constexpr std::array, если его нельзя по нормальному использовать?
Начал пробовать по разному и получилось следующим образом:
template <size_t N>
struct CompileTimeLookupTable {
using TableValue = double;
using LookupTable = std::array<TableValue, N>;
constexpr TableValue f(size_t);
constexpr static auto createLookupTable() {
LookupTable lookupTable {};
...
const_cast<TableValue &>(static_cast<const LookupTable &>(lookupTable)[i]) = f(i); // <--- смущает этот момент
...
return lookupTable;
}
constexpr static auto _lookupTable { createLookupTable() };
};
Это UB или не UB? Как сделать менее костыльно?