2011-09-20 2 views
4

При обновлении до более нового компилятора и разрешения ошибок компилятора я понял, что boost::fusion::for_each требует, чтобы объект функции прошел внутри, имеет оператор const.Функциональный объект в boost :: fusion :: for_each отличается от std :: for_each

Пример из Boost:

struct increment 
{ 
    template<typename T> 
    void operator()(T& t) const 
    { 
     ++t; 
    } 
}; 
... 
vector<int,int> vec(1,2); 
for_each(vec, increment()); 

Это, конечно, не изменилось. Я не понял, что он отличается от std::for_each, который не требует, чтобы оператор был const.

struct increment 
{ 
    template<typename T> 
    void operator()(T& t) // no const here!!! 
    { 
     ++t; 
    } 
}; 
std::vector<int> numbers; 
std::for_each(numbers.begin(), numbers.end(), increment()); 

Есть ли очевидная причина требовать const? Я, очевидно, не могу это изменить, но я хотел бы понять, почему эти два человека отличаются друг от друга.

Спасибо за любые идеи и объяснения!

ответ

1

Константа может потребоваться для предотвращения внутренних изменений состояния функтора, так как порядок вызовов operator() не определен для каждого элемента в последовательности. Таким образом, последующие вызовы не должны зависеть друг от друга.

+0

выглядит как интуиция, но это имеет смысл ;-) – Seb

+0

У вас есть ссылка, где говорится, что заказ не определен? – murrekatt

+0

@ murrekatt Нет, не знаю. Но также [документация] (http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/algorithm/iteration/functions/for_each.html) не упоминает строгих порядок вызовов. И есть [почтовый поток] (http://lists.boost.org/boost-users/2007/03/26355.php), который может вас заинтересовать - основная идея - оптимизация производительности. –

Смежные вопросы