Можете ли вы поймать исключение по типу оператора преобразования? - PullRequest
7 голосов
/ 26 февраля 2010

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

class ExceptionTypeA : public std::runtime_error
{
    // stuff
};

class ExceptionTypeB : public std::runtime_error
{
    // stuff

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};

Могу ли я тогда это сделать, и он активирует блок catch?

try
{
    throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
    // will this be triggered?
}

Я собираюсь догадаться, что этого не произойдет, что, к сожалению, но я подумал, что спросить, так как я не смог найти информацию об этом в сети или на SO. И да, я понимаю, что могу просто запустить программу в своем компиляторе и посмотреть, что произойдет, но это не скажет мне, что стандарт говорит об этом поведении, только то, что реализует мой компилятор (и я не верю этому). 1007 *

1 Ответ

15 голосов
/ 26 февраля 2010

Вы не можете. Стандарт на 15.3/3:

Обработчик соответствует объекту исключения типа E, если

  • Обработчик относится к типу cv T или cv T&, а E и T относятся к одному типу (игнорируя cv- верхнего уровня квалификаторы) или
  • обработчик имеет тип cv T или cv T&, а T является однозначным общедоступным базовым классом E, или
  • обработчик имеет тип cv1 T* cv2, а E - это тип указателя, который можно преобразовать в тип обработчика одним или обоими
    • стандартное преобразование указателя (4.10), не включающее преобразование указателей в закрытое или защищенное или неоднозначные классы
    • конверсия квалификации

Ваш желаемый сценарий не соответствует ни одному из них. cv означает «постоянная и / или летучая комбинация»

...