2015-10-03 13 views
6

È noto (o dovrebbe essere) che legare il risultato di std::min a un riferimento const è una pessima idea, ogni volta che uno degli argomenti di std::min è un valore, poiché l'associazione di riferimento const non viene propagata tramite il ritorno di funzione. Così il seguente codiceNessun riferimento ciondolante per 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; 
} 

dovrebbe produrre un comportamento indefinito dal r è penzoloni. E in effetti, quando si compila con gcc5.2 con -Wall -O3 il compilatore sputa

avvertimento: <anonymous> viene utilizzato non inizializzati in questa funzione [-Wuninitialized]

Tuttavia, la compilazione con clangore (LLVM 7.0.0) l'uso degli stessi flag (incluso anche -Wextra) non emette alcun avviso e il programma sembra "funzionare", ovvero visualizza 41.

Domanda: Il clang utilizza una versione "sicura" di std::min? Come una versione che usa un po 'di SFINAE per tornare di valore ogni volta che uno degli argomenti è un valore? O semplicemente non è necessario emettere alcuna diagnostica e il programma "accade" per produrre il risultato "giusto" in questo scenario UB?

+1

Il comportamento non definito non è definito ... –

+0

@ T.C. Sì, lo so, era solo curioso se il clang avesse risolto questo problema, poiché si tratta di un problema ben noto e non emette alcun avviso di sorta. – vsoftco

risposta

6

È UB. libC++ non ti protegge da questo in alcun modo.

+0

Ok, ti ​​credo, grazie :) – vsoftco

+1

È il tipo più brutto di UB - sembra funzionare bene. –

Problemi correlati