Зачем генерировать исключение, которое является ссылкой, вызывает конструктор копирования? - PullRequest
0 голосов
/ 16 мая 2018

Зачем генерировать исключение, являющееся ссылкой, вызывает конструктор копирования?

struct Error
{
    Error() {}
    Error(const Error&) = delete;
};

int main()
{
    Error& error = *new Error;

    throw error;
}

Ошибка компиляции:

error: declared here
     Error(const Error&) = delete;

Это не происходит при выдаче указателя, например:

int main()
{
    Error* error = new Error;

    throw error;
}

Это нормально.

1 Ответ

0 голосов
/ 16 мая 2018

Вы не можете бросить ссылку. Throwing всегда копирует выброшенное значение выражения в специальную область памяти, отведенную для брошенных объектов .В противном случае вы почти всегда «ловите» висячую ссылку, как это [теоретически] имеет место в вашем коде.

Ваш тип Error не может быть скопирован, поэтому программа невозможна.

Однако указатель, конечно, можно скопировать, и главная проблема в вашем последнем примере - утечка памяти.Также ваша программа просто завершится в операторе throw, так как у вас нет try / catch.

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