Не таким прямым способом, потому что static_assert
там просто не будет разрешен, и аналогичным образом попытка использовать v
в качестве аргумента шаблона не удастся, поэтому не нужно использовать решение типа enable_if
.
В случае ошибок, если constexpr приведет к исключению, вы получите ошибку компиляции.
Вы можете использовать макрос, такой как assert
(допускается начиная с C ++ 14), позволяющий ему бытьоптимизированы в сборках релизов и сохраняют исходное поведение среды отладки.
constexpr int foo(int v)
{
if (v < 0) throw std::invalid_argument("invalid v");
return v * 2;
}
int main() {
int a = -1;
int a2 = foo(a); // Not evaluated at compile time
constexpr int b = foo(2);
constexpr int c = foo(-1); // ERROR
}