Почему ловит const int & int & работает? - PullRequest
0 голосов
/ 22 января 2019

В следующем коде я выбрасываю int, ловлю его как const int &, перебрасываю и снова ловлю, ловлю как int &.

#include <iostream>

int main()
{
    try
    {
        try
        {
            int x = 1;
            throw x;
        }
        catch(const int& e)
        {
            std::cout << "Inner catch" << std::endl;
            throw;
        }
    }
    catch(int & e1)
    {
        std::cout << "Outer catch" << std::endl;
    }

    return 0;
}

Вышеуказанная программа успешно компилируется и печатает

Inner catch
Outer catch

С другой стороны, следующая программа, в которой я пытаюсь инициализировать int & const int &, даже не компилируется.

#include <iostream>
int main()
{
    int x = 0;
    const int& y = x;
    int& z = y 
    return 0;
}

Я получаю следующую ошибку, как и ожидалось

binding ‘const int’ to reference of type ‘int&’ discards qualifiers
     int& z = y

Почему мне разрешено отлавливать const int & как int &, но я не могу назначать cons int & int &?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Бросок всегда по значению.Вы можете поймать его с помощью const или со ссылкой, если хотите, но брошенный объект всегда является копией.Так что совершенно безопасно поймать его с не-1002 * и изменить его.Вы можете проверить это, напечатав адрес int, затем выбросить его, поймать по ссылке и распечатать адрес ссылки.Вы увидите, что это другой адрес.

Вы даже можете сделать это:

try
{
    throw 3;
}
catch (int& q)
{
    q = 4;
}

Значение брошенного объекта со значением 3 изменяется, поскольку q привязывается кновый int, инициализированный с брошенным значением.Вы всегда выбрасываете значение.

Исключением является просто throw;, который перебрасывает существующий объект.Так должно быть, потому что иначе было бы невозможно разумно управлять временем жизни брошенных объектов.

0 голосов
/ 22 января 2019

except.handle / 3

Обработчик соответствует объекту исключения типа E , если
(3.1) - Обработчик типа cv T или cv T & и E и T относятся к одному и тому же типу ( игнорирование cv-квалификаторов верхнего уровня ) или [...]

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