Durante il debug alcuni del nostro codice (C++) ho trovato questo:reinterpret_cast stranezza (separati da virgola espressione)
inline std::string BufferToStr(
const unsigned char* buffer,
int index,
size_t length)
{
std::string retValue(reinterpret_cast<const char*>(&buffer[index], length));
return retValue;
}
Il problema con questo codice (che domina la mancanza di puntatore e lunghezza della stringa assegni) è che la chiusura parentesi di reinterpret_cast
è stata inserita dopo length
quando avrebbe dovuto essere dopo &buffer[index]
. All'inizio pensavo che questo fosse un problema con il compilatore (usando VS2013) ma dopo averlo compilato con successo usando sia VS2012 che gcc 4.6.3, sono arrivato alla conclusione che questo è per qualche motivo permesso. Il codice non verrà eseguito su Windows o Linux poiché il parametro length viene utilizzato come puntatore.
Quindi la mia domanda è: perché viene compilata? Guardando la documentazione di reinterpret_cast
non riesco a trovare alcuna documentazione su di esso dicendo che è possibile passare ad un elenco di valori separati da virgola e che cosa farà con esso.
Perché non dovrebbe essere compilato? Stai dicendo al compilatore di lanciare un 'size_t' in un' const char * ', e lo fa. Non ha bisogno di senso per essere permesso. – Damon
Si noti che l'avviso di attivazione avrebbe dato una forte indicazione di ciò che stava accadendo, come ho mostrato nella mia risposta con un esempio usando 'gcc'. –