Здравствуйте, 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 уже объяснил.