Термины «выполнено» не совсем уместны, когда речь идет о константных выражениях. Даже «оцененный» может использоваться с осторожностью, потому что то, является ли выражение постоянным выражением, зависит частично от поведения того, что произойдет, если выражение было оценено, но не считается оценкой в самом строгом смысле.
[expr.const] описывает требования для ряда различных контекстов «поведения во время компиляции», включая «константное выражение». [expr.const] / (5.2) говорит, что если при оценке выражения будет вычислена функция не-constexpr, то выражение не является основным константным выражением и, следовательно, не является константным выражением. Если выражение используется в контексте, требующем константного выражения (например, static_assert
, аргумент шаблона нетипичного типа и т. Д. c.), Программа имеет некорректную форму и должно быть сообщение о диагностике c. Не существует правила, разрешающего что-либо вроде разрешения неконстантного выражения в таком контексте или пропуска некоторых частей гипотетической оценки, если выражение является преобразованным константным выражением и значение результата выражения может быть определено, несмотря на то, что оно не является константным выражением.
Таким образом, если example_function
не объявлено constexpr
, то example_function() || true
не является константным выражением, поскольку для оценки потребуется вызов функции. Но true || example_function()
является константным выражением, так как оценка не будет вызывать функцию.
Ваш is_constexpr<T>
гарантированно сработает, потому что любое нарушение семантики c, связанное с параметром шаблона внутри Требуемое выражение не делает программу плохо сформированной, а просто делает Требуемое выражение значение результата false
( [expr.prim.req] / 6 ) , В is_constexpr<example_function>
использование неконстантного выражения T()
в качестве аргумента шаблона для std::enable_if
через аргумент шаблона по умолчанию, экземпляром которого является ConstexprHelper<T>
, является такой ошибкой семантики c, поэтому выражение-запроса имеет значение false
.