Я не знаю, как формулировать вопрос очень хорошо в строке короткометражного фильма, таким образом позвольте мне попробовать более длительное объяснение. Предположим, что у меня есть эти классы исключений:
class ExceptionTypeA : public std::runtime_error
{
// stuff
};
class ExceptionTypeB : public std::runtime_error
{
// stuff
operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};
Я могу затем сделать это и иметь его, инициировали блок выгоды?
try
{
throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
// will this be triggered?
}
Я собираюсь предположить, что это не будет, который неудачен, но я думал, что спрошу, так как я не мог найти информацию о нем в сети или в ТАК. И да, я понимаю, что мог просто запустить программу в своем компиляторе и видеть то, что происходит, но это не сказало бы мне, что в стандарте говорится об этом поведении, что мой компилятор реализует (и я не доверяю ему).
Вы не можете. Стандартный в 15.3 / 3
:
Обработчик соответствует объекту исключения типа E, если
- Обработчик имеет тип
cv T
илиcv T &
и E и T имеют один и тот же тип (игнорируя квалификаторы верхнего уровня cv - ), или- обработчик имеет тип
cv T
илиcv T &
и T - однозначный общедоступный базовый класс E, или- обработчик имеет тип
cv1 T * cv2
, а E - тип указателя, который может быть преобразован в тип обработчика { {1}} одним или обоими
- стандартным преобразованием указателя (4.10), не включающим преобразования в указатели на частные, защищенные или неоднозначные классы
- a преобразование квалификации
Ваш желаемый сценарий не соответствует ни одному из них. cv
означает «постоянную и / или изменчивую комбинацию»