Каково точное значение фразы «как будто» в стандарте и как она работает, когда пользователь может изменять отдельные части поведения.
Вопрос касается стандарта С++, когда речь идет о версии nothrow operator new
. 18.4.1.1/7 гласит (выделено мной):
Эта невозвратная версия оператора new возвращает указатель, полученный как если бы полученный из обычной версии.
Насколько я понимаю, «как если бы» не требует конкретной реализации, если поведение является подходящим. Итак, если operator new
был реализован так (я знаю, что это несовместимая реализация, так как нет цикла или использования new_handler, но я сокращаю это, чтобы сосредоточиться на моей проблеме):
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}
Тогда было бы законно написать версию nothrow следующим образом:
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}
Но допустим, программа заменяет operator new
, чтобы использовать какой-то другой распределитель. Означает ли «как если бы» компилятор автоматически изменил поведение версии nothrow, чтобы использовать этот другой распределитель? Обязан ли разработчик заменить как обычную, так и нулевую версии?