Es ist gut bekannt (oder sollte es sein), dass die Bindung des Ergebnisses std::min
an eine const
Referenz ist eine sehr schlechte Idee, wenn eines der Argumente von std::min
ist ein rvalue, seit const
Referenzbindung wird nicht durch Funktionsrückgabe weitergegeben. So ist der folgende CodeKeine dangling Referenz für Std :: Min in LibC++
#include <iostream>
#include <algorithm>
int main()
{
int n = 42;
const int& r = std::min(n - 1, n + 1); // r is dangling after this line
std::cout << r;
}
sollte nicht definiertes Verhalten erzeugen, da r
baumelt. Und in der Tat, wenn sie mit gcc5.2 mit -Wall -O3
Kompilieren der Compiler spucken
Warnung:
<anonymous>
wird verwendet, nicht initialisierte in dieser Funktion [-Wuninitialized]
jedoch mit Klirren Kompilieren (llvm 7.0.0) die Verwendung der gleichen Flags (sogar einschließlich -Wextra
) gibt keine Warnung aus, und das Programm scheint "zu arbeiten", dh zeigt 41
an.
Frage: Ist der Klang mit einer "sicheren" Version von std::min
? Wie eine Version, die SFINAE verwendet, um nach Wert zurückzugeben, wenn eines der Argumente ein rvalue ist? Oder ist es einfach nicht erforderlich, irgendeine Diagnose zu senden und das Programm "passiert", um das "richtige" Ergebnis in diesem UB-Szenario zu erzeugen?
Undefiniertes Verhalten ist nicht definiert ... –
@ T.C. Ja, ich weiß, es war nur kurios, ob der Klamm das behoben hat, da es ein bekanntes Problem ist und keinerlei Warnung ausstrahlt. – vsoftco