Правильное использование BOOST_FOREACH?

Когда используешь 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 ответа

Решение

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

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

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

Другие вопросы по тегам