Bei diesem Code kommt es zu einem Überlauf, weil der Typ der Zwischenergebnisse nicht vom Typ des Ziels abhängt:
vector< uint8_t > increments;
…
vector< uint32_t > increasing( increments.size() );
partial_sum( increments.begin(), increments.end(), increasing.begin() );
Dies ist jedoch auch der Fall (GCC 4.2):
partial_sum( increments.begin(), increments.end(), increasing.begin(),
plus< uint32_t >() );
Sollte nicht plus< uint32_t >
seine Operanden befördern und den Überlauf vermeiden?
Editar: Ich bin zu SO-süchtig. Nach einer kurzen Pause habe ich mich wieder hingesetzt und die Umsetzung überprüft. Es tut dies:
/* input_iterator::value_type */ __value = __binary_op(__value, *__first);
*++__result = __value;
Ich glaube nicht, dass das regelkonform ist, also werde ich die neueste Version überprüfen und vielleicht einen Fehler melden und los geht's: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42943