Is there any reason that irq_callback_table needs to be an std::array<>? If it were an old fashioned C style array, there would be no bounds checking whatsoever so no possibility of an exception.
irq_callback_table
std::array<>