Re[8]: static_assert в catch секции
От: so5team https://stiffstream.com
Дата: 23.12.24 12:23
Оценка: 12 (1)
Здравствуйте, rg45, Вы писали:

S>>Почему отсутствует? Была просто f() показанная выше, стала:

S>>
S>>template<typename T>
S>>constexpr int f() {
S>>  try {
S>>    return T::some_func();
S>>  }
S>>  catch(...) {
S>>    // Ну не шмогли, ну и ладно.
S>>    return 0;
S>>  }
S>>}
S>>


R>Но в таком варианте выражение T::some_func() заведомо не может быть источником исключения, иначе это просто не скомпилируется (или я чего-то не знаю). Отсюда снова вопрос о ценности try-catch в constexpr функции. Вопрос же именно о ценности, а не о том, какова могла быть предыстория образования данного кода.


Так там не зря же вызывается some_func из T. В зависимости от T это могут быть как some_func с исключениями внутри, так и без исключений.

Грубо говоря:
struct constexpr_ready_traits {
  static constexpr int some_func() { return 0; }
};

struct runtime_only_traits {
  static int some_func() {
    if(is_appropriate_moon_phase()) throw std::runtime_error{ "Not now, bro!" };
    return 42;
  }
};

constexpr int f1 = f<constexpr_ready_traits>();
int f2 = f<runtime_only_traits>();


Вроде все сходится.

Тут другой вопрос: зачем внутри f пытаться делать проверку на наличие исключений в compile-time, но этот вопрос тов.Videoman уже объяснил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.