C ++ 11 – static_assert в функции constexpr?
Как правильно выполнить static_assert
в функции constexpr
? Например:
constexpr int do_something(int x) { static_assert(x > 0, "x must be > 0"); return x + 5; }
Это недопустимый код C ++ 11, потому что функция constexpr должна содержать только оператор return. Я не думаю, что стандарт имеет исключение из этого, хотя GCC 4.7 не позволяет мне скомпилировать этот код.
- Статические утверждают в C
- static_assert не удается выполнить компиляцию, хотя функция шаблона называется нигде
- BOOST_STATIC_ASSERT без повышения
- Способы выражения ASSERT во время сборки в C
Это недопустимый код C ++ 11, потому что функция constexpr должна содержать только оператор return.
Это неверно. static_assert
в функции constexpr
отлично. Что не очень хорошо, так это использование функциональных параметров в постоянных выражениях, как вы это делаете.
Вы можете бросить, если x <= 0
. Вызов функции в контексте, который требует постоянного выражения, не будет компилироваться
constexpr int do_something(int x) { return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0")); }
Это работает и является допустимым кодом C ++ 11, потому что аргументы шаблона только время компиляции:
template constexpr int do_something() { static_assert(x > 0, "x must be > 0"); return x + 5; }
Я столкнулся с теми же проблемами, что и с постоянными выражениями в C ++. На данный момент существует несколько четких документов о Constexprs. И обратите внимание, что в нем есть некоторые известные ошибки в gcc’s tracker, но ваша проблема, похоже, не является ошибкой.
Обратите внимание: если вы объявляете функции constexpr внутри classов, вы не можете использовать их внутри classа. Это тоже не ошибка.
Изменить: это разрешено в соответствии со стандартом: 7.1.3 состояния
… или составной оператор, содержащий только
- null,
- static_assert -declarations
- объявления typedef и псевдонимы-объявления, которые не
определить classы или enums, - с помощью деклараций,
- используя-директивы,
- и ровно один оператор возврата