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 ++ 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,
    • с помощью деклараций,
    • используя-директивы,
    • и ровно один оператор возврата
    Давайте будем гением компьютера.