Я обсуждаю, как правильно обрабатывать контейнеры в качестве параметров.Должен ли я очищать() контейнеры, переданные в качестве параметра, или заменять новый объект?
У нас есть функция, которая принимает в качестве параметра контейнера, и хочет вернуть контейнер, заполненный только с тем, что функция помещает в него:
class bar;
void foo(std::vector<bar> &bars)
{
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
С одной стороны дискуссии, у нас есть люди, которые говорят, сначала необходимо выполнить bars.clear()
, а затем запустить функцию.
Например:
void foo(std::vector<bar> &bars)
{
bars.clear();
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
Мои собственные предпочтения, чтобы попытаться достичь прочной гарантии исключения, насколько я могу, а это означает, что делает местный контейнер, заполняя что и замену перед возвратом, но в противном случае оставляя bars
нетронутым.
Например:
void foo(std::vector<bar> &bars)
{
std::vector<bar> localBars;
//do stuff that fills localBars.
//exceptions may be thrown.
//we may also legally return early
if (returnEarly)
{
bars.swap(localBars);
return;
}
//do more stuff that may change localBars
bars.swap(localBars);
return;
}
Первый пример представляет собой 'классический' метод; очистки ваших параметров, прежде чем что-либо делать и оттуда.
Второй способ, для меня, устанавливает сильную гарантию исключения (если ничего не делать, функция может изменять внутренние состояния) и избегает вызова clear().
Есть ли какие-либо преимущества или недостатки в выборе одного метода над другим?
Обратите внимание, что для этой функции не требуется сильная гарантия исключения; если функция не сработает ничего в параметрах или что-то еще, что она имеет значение, к тому времени, когда она встанет на обработчик исключений.
http://stackoverflow.com/faq: Если ваша мотивация для задавания вопроса: «Я бы хотела участвовать в обсуждении ______», тогда вы не должны спрашивать здесь. –
Я в дискуссии о ..., каковы плюсы и минусы для любой стороны, кажется мне совершенно правильным вопросом – Grizzly
Почему бы не вернуть результат? Тогда функция не может иметь побочных эффектов, что является наиболее надежной гарантией исключения. –