Когда я объявляю condition_variable
, это может бросить std::system_error
,
Но как насчет того, когда я объявляю тип POD (например, int
, double
или же float
)?
Как код ниже:
int main()
{
//do something
int i; //will here throw exception?
}
Если объявление типа POD может вызвать исключение, как я могу гарантировать
void test() noexcept
{
//do something
int i;
}
является noexcept
?
Но как насчет объявления фундаментального типа (например, int, double или float)?
декларирование Тип POD объекты не будут вызывать исключение.
Конструкторы не POD-типов могут генерировать исключения. Только документы / исходный код этих типов могут помочь вам понять, произойдет ли это для определенного типа.
Это конструктор из std::condition_variable
это может бросить исключение. Примитивные типы, такие как int
а также double
не имеют конструкторов. У них просто есть некоторое стековое пространство, выделенное для них, и все, плюс записываемое значение, если вы инициализируете переменную. Единственный способ, которым это может вызвать исключение, — это переполнение стека и непредвиденное поведение, приводящее к выбросу.
Типы POD обычно инициализируются с помощью выражений инициализатора вместо конструкторов. Как и конструкторы, инициализаторы могут генерировать исключения. Но если у вас нет ни конструктора, ни инициализатора, нет кода, связанного с определением, и, следовательно, также нет возможности для этого кода выбросить.