Объект функции в boost :: fusion :: for_each отличается от std :: for_each - PullRequest
4 голосов
/ 20 сентября 2011

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

Пример из 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 Ответ

1 голос
/ 20 сентября 2011

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

...