Я пытаюсь понять функцию noexcept. Я знаю, что это может сбивать с толку, но, кроме того, это не может быть выведено из вызывающей функции, когда это возможно.
Это нерабочий пример этой ситуации,
void f(){}
void f() noexcept{} // not allowed in c++
void g(){f();} // should call f
void h() noexcept{f();} // should call f noexcept
int main(){
g();
h();
}
Если в вызывающей функции (h
) нет блока try/catch, то компилятор может сделать вывод, что кто-то заинтересован в вызове конкретной функции f.
Используется ли этот шаблон в каком-либо другом обходном пути?
Все, что я могу себе представить, это что-то вроде этого, но это не очень общее:
template<bool NE> void F() noexcept(NE);
template<>
void F<true>() noexcept(true){}
template<>
void F<false>() noexcept(false){}
void g(){F<noexcept(g)>();} // calls F<false>
void h() noexcept{F<noexcept(h)>();} // call F<true>
Некоторые могут задаться вопросом, почему это имеет смысл. Моя логика такова, что С++ позволяет перегружать по отношению к const
как аргумент функций, так и функции-члены. Например, const
функций-членов предпочитают вызывать const
перегрузок членов.
Я думаю, что для noexcept
функций имеет смысл вызывать noexcept
"перегрузки". Особенно, если они не вызываются из блока try/catch.
if constexpr
как в:template<bool NE> void F() noexcept(NE) { if constexpr(NE) { ... } else { ... } }
. Не уверен, что это полезно для вашего вопроса. - person Innocent Bystander   schedule 18.01.2018f
, не может дать сбой, и в этом случае нет необходимости в версииnoexcept(false)
, либо он может дать сбой, и поэтому версииnoexcept(true)
нужен какой-то способ сообщить об этом сбое, что обычно означает другую сигнатуру. - person T.C.   schedule 18.01.2018std::nothrow
и на то, как она используется. - person Deduplicator   schedule 19.01.2018std::nothrow
, кажется, это идиома, которой нужно следовать. - person alfC   schedule 19.01.2018new
в комментарии Deduplicator очень показателен. - person alfC   schedule 19.01.2018std::nothrow
. Имеет 2 перегрузки для многих функций, одна из которых noexcept и возвращает код ошибки; другой -- выдает исключение. - person Innocent Bystander   schedule 21.01.2018