Podczas debugowania niektóre z naszego kodu (C++) Znalazłem to:reinterpret_cast dziwność (oddzielone przecinkiem wyrażenie)
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;
}
Problem z tym kodem (z widokiem na brak kontroli wskaźnika, a długość łańcucha) jest to, że po zamknięciu nawias reinterpret_cast
został umieszczony po length
, gdy powinien być po &buffer[index]
. Najpierw myślałem, że to jest problem z kompilatorem (używając VS2013), ale po pomyślnym skompilowaniu go przy użyciu VS2012 i gcc 4.6.3, doszedłem do wniosku, że jest to z jakiegoś powodu dozwolone. Kod nie będzie działał w systemie Windows ani Linux, ponieważ parametr długości jest używany jako wskaźnik.
Moje pytanie brzmi: dlaczego to się kompiluje? Patrząc na dokumentację reinterpret_cast
nie mogę znaleźć na niej żadnej dokumentacji mówiąc, że możesz przekazać oddzieloną przecinkami listę wartości do niej i co z nią zrobi.
Dlaczego nie należy go skompilować? Mówisz kompilatorowi, żeby rzucił 'size_t' na' const char * ', i to robi. Nie ma sensu być dozwolonym. – Damon
Zauważ, że włączenie ostrzeżenia dałoby wyraźne wskazanie, co się działo, jak pokazałem w mojej odpowiedzi na przykładzie używając 'gcc'. –