Это работает и является допустимым кодом C ++ 11, потому что аргументы шаблона - только время компиляции:
template <int x>
constexpr int do_something() {
static_assert(x > 0, "x must be > 0");
return x + 5;
}
Я столкнулся с теми же проблемами, что и вы с константными выражениями в C ++. На данный момент есть немного ясной документации о constexprs. И обратите внимание, что в трекере ошибок gcc есть некоторые известные ошибки, но ваша проблема, похоже, не ошибка.
Обратите внимание, что если вы объявляете функции constexpr внутри классов, вы не можете использовать их внутри класса. Это также не является ошибкой.
Редактировать: это разрешено в соответствии со стандартом: 7.1.3 состояния
... или составной оператор, содержащий только
- нулевые операторы,
- static_assert -declarations
- объявления typedef и объявления псевдонимов, которые не
определить классы или перечисления,
- с помощью Директив,
- и ровно одно выражение возврата