Трудно сделать безопасной функцию, выполняющую две различных операции.
Далее говорилось, что на основании этого функция pop() из класса std::stack (или другого контейнера, имеющего pop-возможность) не возвращает значение, которое ликвидируется из контейнера, поскольку оно может потеряться, если соответствующий operator= или конструктор, принимающий это значение возбудит исключение.
Вопрос: можно ли в pop(T& value) сделать параметр value, в который будет сохраняться ликвидируемое значение? В таком случае не должно быть потери значения в результате исключения. Будет ли такая реализация безопасной?
Например, такая реализация:
template<typename T>
void Stack<T>::pop(T& value)
{
if (this->m_size != 0)
{
value = m_array[m_size - 1];
--m_size;
}
}
Саттер в своей "Решение сложных задач на С++" признает это решение безопасным с точки зрения исключений (задача 2.3, стр. 112).
Но это решение он отвергает именно как выполняющее две задачи одновременно, а не как опасное с точки зрения исключений.
Так что ответ на ваш вопрос - да :)
Но! Этот pop() не гарантирует иное - снятие значения со стека. Если там лежит какой-то мерзкий элемент, который при копировании генерирует исключение - то при наличии отдельных top() и pop() вы можете получить на него ссылку не копируя сам элемент и поработать с ним, а потом pop() снять его со стека.
Но ваш pop() может просто ничего не суметь сделать и угробить программу вечным исключением :)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники