Правильное использование BOOST_FOREACH? - PullRequest
4 голосов
/ 16 февраля 2010

При использовании BOOST_FOREACH следующий код безопасен?

BOOST_FOREACH (const std::string& str, getStrings())
{
  ...
}

...

std::vector<std::string> getStrings()
{
  std::vector<std::string> strings;
  strings.push_back("Foo");
  ...
  return strings;
} 

Или я должен взять копию контейнера до вызова BOOST_FOREACH, например:

const std::vector<std::string> strings = getString();
BOOST_FOREACH (const std::string& str, strings)
{
  ...
}

В первом примере есть ли опасность, что BOOST_FOREACH может в конечном итоге вызвать getStrings() несколько раз?

Ответы [ 2 ]

14 голосов
/ 16 февраля 2010

И хотя BOOST_FOREACH - это макрос, он замечательно хорошо себя ведет.Он оценивает свои аргументы ровно один раз, что не приводит к неприятным сюрпризам

1 голос
/ 16 февраля 2010

Вы можете использовать BOOST_FOREACH всякий раз, когда вы хотите пройтись, кратко. Рассмотрим Boost.Range для обхода ваших собственных классов с помощью BOOST_FOREACH.

Я использую BOOST_FOREACH для предотвращения загрязнения кода с помощью операторов for, итераторов (инициализация объявлений и т. Д.) Я использую алгоритмы STL (зубчатые колеса) с усилением лямбда-выражений (клей), насколько я могу. Это делает код более понятным, чем пользовательский цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...