about: Объем объекта исключения в C ++: почему я не могу получить копию? - PullRequest
0 голосов
/ 09 июля 2020

В вопросе об объеме исключения изложено Aj. эти предложения throw и catch будут создавать копии исключения (если, я полагаю, не используется ссылка)

Я попробовал написать небольшой игрушечный код и не понял результата. здесь:

//g++  7.4.0
#include <iostream>
using namespace std;
struct Some_error {
    Some_error(float code):err_code(code){ cout << "Some_error(" << err_code << ")\n";  }
    ~Some_error()                        { cout << "~Some_error(" << err_code << ")\n"; }
    Some_error(const Some_error& o):err_code(o.err_code+0.1)      { cout << "Some_error(copy::" << err_code << ")\n";  }
    Some_error(Some_error&& o):err_code(std::move(o.err_code)+.01){ cout << "Some_error(move::" << err_code << ")\n";  }
    int get_code() const { return err_code; }
    private : float err_code;
};

int do_task() { 
    if ( false )  return 42; else throw Some_error {1};
    cout << "end do_task\n" ;
}


void taskmaster(){
    try { auto result = do_task(); cout << "the answer is " << result << "\n" ; }
    catch (Some_error e) { cout << "catch Some_error : " << e.get_code() << "\n" ; }
    cout << "end taskmaster\n" ;
}

int main() { taskmaster(); }

след, который я получаю, выглядит следующим образом:

Some_error(1)
Some_error(copy::1.1)
catch Some_error : 1
~Some_error(1.1)
~Some_error(1)
end taskmaster

Теперь, во-первых, поскольку я не использовал здесь ссылку, согласно Aj., я ожидал, что произойдет 2 копии .

И, во-вторых, была копия, которая установила err_code на 1.1, но на дисплее все еще 1.

Примечание: для полноты картины я изменил уловку на: catch (Some_error & д), и тогда мне кажется, что след выглядит нормально:

Some_error(1)
catch Some_error : 1
~Some_error(1)
end taskmaster

1 Ответ

1 голос
/ 09 июля 2020

Я ожидал, что будет 2 копии.

Почему? Блок catch делает только одну копию. Где будет вторая копия?

установите err_code равным 1.1, но на дисплее все равно будет 1.

Поскольку get_code возвращает int, поэтому плавающий значение балла усекается.

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