2 Stimmen

implizite Beförderung zur Vermeidung eines Überlaufs in std::partial_sum

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X