Re: static_assert в catch секции
От: rg45 СССР  
Дата: 21.12.24 14:44
Оценка: 78 (2)
Здравствуйте, Videoman, Вы писали:

V>Как известно в С++20 подвезли возможность использовать try catch блоки внутри constexpr выражений. Стало удобно, но появилась следующая проблема:


V>Есть функция func1(), которая без проблем работает в constexpr режиме и есть внешняя функция func2(), которая никогда не должна выкидывать исключения, которая вызывает внутри себя первую, типа такого:
V>template<typename...>
V>inline constexpr bool always_false = false;

V>template<typename type_t>
V>constexpr int func2() noexcept
V>{
V>  try {
V>    return func1();
V>  } catch (...) {
V>    static_assert(always_false<type_t>, "error!");
V>    return 0;
V>  }
V>}
V>

V>Так вот, стандартный подход с always_false тут не прокатывает и static_assert срабатывает всегда, а мне нужно что бы он срабатывал только если возникло исключение. Как такое можно организовать?

Ну да, для того, чтобы это сработало, компилятор должен исключить этот static_assert из компиляции. А у него для этого нет поводов. Тут нужно как-то адаптировать дизайн. Например, обернуть в constexpr if:

http://coliru.stacked-crooked.com/a/d21b3db809532a31

#include <exception>
#include <utility>

template<typename...>
inline constexpr bool always_false = false;

constexpr int func1()
{
    return 1;
}

template<typename type_t>
constexpr int func2() noexcept
{
  constexpr auto call_func1 = []() -> std::pair<int, bool> {
    try {
      return {func1(), true};
    } catch (...) {
      return {};
    }
  };    
  constexpr auto res = call_func1();

  if constexpr (res.second) return res.first;
  else static_assert(always_false<type_t>, "error!");
}

int main()
{
  return func2<int>();
}
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.