Для меня это работает.
typedef int (*X)();
template<typename T>
struct is_callable : boolean<sizeof((*(X*)(T*)0)()) >= 0> { }; // works!
Таким образом, похоже, что компилятор не уверен, что вы всегда будете передавать указатель на функцию T при создании экземпляра класса шаблона! Итак, форсируем компилятор с явным приведением.
[Редактировать]: Кроме того, если подумать, я не понимаю, что вы на самом деле пытаетесь сделать. Вы пытаетесь измерить размер указателя функции, который принимает один параметр? Как это будет отличаться для функций с разными типами возвращаемых значений? Зачем вам вообще нужен шаблон для константного выражения (например, sizeof (void *))?
Пожалуйста, проверьте эту тему для большего понимания
Что гарантируется относительно размера указателя функции?