Если под недействительным вы подразумеваете, что метод не удовлетворяет ожидаемым значениям, вы можете выбросить
std::logic_error
or
std::runtime_error.
Если вы имеете в виду что-то связанное с приведениями, например, один объект не может быть преобразован в другой - для этого нет исключения, и оно не будет выброшено автоматически.
На самом деле это будет. Но только для dynamic_cast <> по ссылкам.
Это бросит
std::bad_cast
Я не уверен, что это хорошая идея - бросить это самостоятельно.
Я предпочитаю использовать logic_error и его производные, если кто-то передал неправильный параметр, потому что это логическая ошибка: программист передал неверный тип аргумента.
Но больше всего мне нравится использовать assert в таких случаях. Потому что такие вещи, как передача неправильных значений или типов в вашу функцию, могут быть приемлемы только во время разработки, и в выпуске следует избегать таких проверок.