Beobachte seltsames Verhalten mit 'auto' und std :: minmax

8

Ich verwende GCC 4.7.2 und Boost 1.58.0 unter SUSE Enterprise Linux 11. Ich habe das folgende Code-Snippet, das im Grunde eine Liste von Polygonen durchläuft, um ihre Länge / Breite zu berechnen. Ich sehe seltsame Ausgaben, wenn ich das Schlüsselwort 'auto' mit der Funktion std :: minmax verwende. Zum Vergleich deklariere ich auch eine zweite Variable, bei der die Typen explizit deklariert sind (d. H., Dim vs dim1).

%Vor%

Für die erste Iteration dieser Schleife ist die erwartete Ausgabe die richtige.

%Vor%

Wenn ich jedoch "dim1" auskommentiere und denselben Code erneut drücke (d. h., habe ich einfach "auto dim"), bekomme ich seltsame Ergebnisse mit std :: minmax.

%Vor%

Was mache ich hier falsch?

Hier ist das minimale Beispiel (bearbeitet basierend auf der Antwort unten).

%Vor%     
user4979733 11.04.2016, 17:40
quelle

1 Antwort

13

Dies ist einer der Fälle, in denen nicht auto als Typspezifizierer verwendet werden soll. std::minmax gibt ein Paar Referenzen zurück:

%Vor%

Das wird auto herleiten. Aber delta() gibt ein temporäres zurück. Also wenn du schreibst:

%Vor%

dim hält zwei freie Referenzen. Aber wenn du schreibst:

%Vor%

Sie halten nur die Werte direkt. Deshalb funktioniert das, aber auto nicht. Die zusätzliche Conversion, die Sie ausführen, verhindert, dass Sie hängende Referenzen halten.

Alternativ können Sie der Vollständigkeit halber eine andere Überladung von minmax verwenden, die keine Referenzen zurückgibt:

%Vor%

was nur einige zusätzliche Klammern beinhaltet:

%Vor%

Aber ich würde vorschlagen, den Typ explizit zu benennen. Das scheint mir weniger fehleranfällig zu sein.

    
Barry 11.04.2016, 17:51
quelle

Tags und Links