È 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?
Il comportamento non definito non è definito ... –
@ 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