Когда ты выбрасываешь объект в C++, копирующий конструктор должен быть публично доступен, даже если объект никогда на самом деле не копируется. Компилятор требует это независимо от уровня оптимизации.
Фактическое количество копий зависит от компилятора и может быть нулевым. Современные компиляторы обычно оптимизируют лишние копии через такие техники, как Return Value Optimization (RVO) и exception object elision.
Стандарт C++ позволяет компиляторам:
Критически важно понимать:
class MyException : public std::exception {
public:
MyException(const MyException&) = default; // Копирующий конструктор необходим
// ...
};
throw MyException(); // Может не создать ни одной копии несмотря на требование
Такой дизайн обеспечивает безопасность исключений и корректность типов, одновременно позволяя компиляторам оптимизировать производительность. Поэтому когда спрашивают, сколько раз объект скопируется при выбросе, точный ответ: ноль или больше, но копирующий конструктор всегда должен быть доступен.
Copy конструктор объекта исключения должен быть публично доступен на этапе компиляции, даже если компилятор оптимизирует все фактические копирования во время выполнения.
Новый — ещё не проверен сообществом
Вы