Предположим, у меня есть эта функция
void foo() noexcept
{
// Safely noexcept code.
}
И затем этот класс:
class Bar
{
Bar(const Bar&) { ... } // Is not noexcept, so might throw
// Non movable:
Bar(Bar&&) = delete;
};
Теперь мне нужно изменить foo(), чтобы получить Bar по значению:
void foo(Bar bar) // noexcept?
{
// Safely noexcept code
}
Я предполагаю, что копирование Bar выполняется до вызова foo, поэтому теоретически код foo все еще может быть noexcept, но я не уверен, как это определяется на уровне C++. Должен ли foo удалить noexcept или это вызывающий абонент, который может выбросить при копировании Bar? Зависит ли это от режима вызова (stdcall, farcall и т. д.) или компилятора? Обновление: в других вопросах я не нашел ссылок на соглашение о вызовах. Это должно повлиять на поведение. Я полагаю.
foo
может остатьсяnoexcept
. копирование (если есть) происходит до вызова. - person Jarod42   schedule 20.09.2019