2015-10-03 26 views
6

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?

+1

Undefiniertes Verhalten ist nicht definiert ... –

+0

@ 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

Antwort

6

Es ist UB. libC++ schützt Sie davor nicht.

+0

Ok, ich glaube dir, danke :) – vsoftco

+1

Es ist die schlimmste Art von UB - es scheint gut zu funktionieren. –