Поскольку они неоднозначны.
template<class Exception,class Argument>
std::nullptr_t allocate_help(const Argument& arg,Int2Type<true>)const;
template<class Exception>
std::nullptr_t allocate_help(const Exception& ex,Int2Type<true>)const;
Сигнатура второй функции является подмножеством первой, что означает, что в контексте вызова вашей функции они одинаковы с восприятием "любого типа"."в качестве первого аргумента и Int2Type в качестве второго аргумента.
allocate_help<std::bad_alloc>(e,Int2Type<true>());
Может принимать следующие значения:
std::nullptr_t allocate_help<std::bad_alloc, std::bad_alloc>(const std::bad_alloc& arg,Int2Type<true>)const;
или
std::nullptr_t allocate_help<std::bad_alloc>(const std::bad_alloc& ex,Int2Type<true>)const;
Как будет выбирать компилятор?