Можно ли поймать исключение типом оператора преобразования?

Я не знаю, как формулировать вопрос очень хорошо в строке короткометражного фильма, таким образом позвольте мне попробовать более длительное объяснение. Предположим, что у меня есть эти классы исключений:

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?
}

Я собираюсь предположить, что это не будет, который неудачен, но я думал, что спрошу, так как я не мог найти информацию о нем в сети или в ТАК. И да, я понимаю, что мог просто запустить программу в своем компиляторе и видеть то, что происходит, но это не сказало бы мне, что в стандарте говорится об этом поведении, что мой компилятор реализует (и я не доверяю ему).

8
задан rmeador 26 February 2010 в 16:46
поделиться

1 ответ

Вы не можете. Стандартный в 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 означает «постоянную и / или изменчивую комбинацию»

15
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: