Бросать исключение как const & - PullRequest
7 голосов
/ 19 января 2012

Возьмите следующий код:

void DoThrow( const std::exception& e )
{
    throw e;
}

int main( int nArgs, char* args[] )
{
    std::exception e;
    try
    {
        DoThrow( e );
    }
    catch( std::exception& e )
    {
        // const exception ref is caught
    }


    return 0;
}

Я пытаюсь установить правильность const в моем проекте и непреднамеренно создал вышеуказанную ситуацию.В Dev Studio блок catch ДЕЙСТВИТЕЛЬНО перехватывает исключение, несмотря на то, что он вызывается как const, но перехватывается как неконстантный.: -)

Ответы [ 2 ]

9 голосов
/ 19 января 2012

throw принимает выражение и создает посредством инициализации копирования объект исключения, основанный на статическом типе этого выражения.Объект исключения не является объектом const.

Оператор catch инициализирует ссылку на объект исключения, а не объект (если есть), на который ссылается выражение throw.

0 голосов
/ 19 января 2012

Я не знаю, о чем говорится в спецификации, но мне кажется, что на практике исключение отправляется в правильный блок «catch» с использованием RTTI (некоторый код, синтезированный компилятором, должен делать это), к которому «const "не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...