2009-04-04 20 views
7

for_each akzeptiert InputIterators:Ist es in Ordnung, Objekte mit std :: for_each zu mutieren?

//from c++ standard 
template <class InputIterator, class Function> 
    Function for_each (InputIterator first, InputIterator last, Function f); 

ist es in Ordnung, das Objekt in der Funktion f, wie dies zu ändern:

in VC
struct AddOne 
{ 
    void operator()(int & x){x = x + 1;} 
}; 

std::vector<int> vec(10); 
std::for_each(vec.begin(),vec.end(),AddOne()); 

Dieser Code funktioniert ++ 2008 und mit GCC auch, aber ist es auch tragbarer (legaler) Code?
(InputIterators sind nur als rvalue verwendbar sein garantiert, in diesem Fall sind sie als L-Wert verwendet werden, in ADDone des Operators())

Antwort

7

dieses article lesen.

Um pedantisch zu sein: for_each ist eine nicht-modifizierende Sequenzoperation. Es ist nicht beabsichtigt, die Sequenz zu ändern. Es ist jedoch in Ordnung, die Eingabefolge zu ändern, wenn for_each verwendet wird.

2

Es ist legal - die Eingabe-Iteratoren werden verwendet, um den Bereich anzugeben, nicht um die Verarbeitung zu tun.

Interessanterweise listet Josuttis in seinem Buch "The C++ Standard Library" for_each als modifizierend, raher als nicht modifizierend.

4

Sie missverstehen etwas. Wenn gesagt wird, dass Eingabe-Iteratoren nur als R-Werte verwendbar sind, heißt das nicht, dass Sie nicht irgendwie einen I-Wert aus einem Iterator erhalten können. Das bedeutet also nicht, dass das Ergebnis von *iterator ein rvalue ist. Was du/for_each an AddOne übergibt, ist das Ergebnis von operator* - nicht der Iterator selbst.

Über for_each und eine modifizierende Funktion Objekt - lesen this question

3

Wenn in std Zweifel Verwendung :: verwandeln, wie es auch für den flüchtigen Leser Ihres Codes vermitteln wird, dass Sie etwas ändern möchten.

Verwandte Themen