constexpr
функции должны использоваться во время компиляции и выполнения. Вы вызываете нестатическую функцию-член, поэтому она должна работать независимо от того, известен ли объект класса во время компиляции. Если требуется, чтобы объект был известен во время компиляции, функция больше не работает во время выполнения.
Самый простой способ обойти это - использовать функцию, которая не зависит от неиспользуемого объекта класса:
template<uint8_t Index>
static constexpr ElementType get() {
// some logic
return T();
}
Если это не вариант, потому что вы используете объект класса, то вам нужно убедиться, что объект является constexpr для его использования:
constexpr SparseArray<int, 3> array(1, 2, 3);
auto seq2 = std::integer_sequence<int, array.get<0>()>{};
Независимо от того, где вы используете get
, единственный способ использования результата в качестве значения времени компиляции - это если все параметры, включая объект, являются значениями времени компиляции.
EWG приняла constexpr!
для принудительной оценки функции во время компиляции, но ваш исходный пример не будет скомпилирован, пока не будет использован объект constexpr SparseArray
.