Während einige unserer Code (C++) Debuggen ich dies gefunden:reinterpret_cast Fremdheit (Comma Separated expression)
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;
}
Das Problem mit diesem Code (mit Blick auf den Mangel an Zeiger und Stringlänge überprüft) ist, dass das Schließen Klammer der reinterpret_cast
wurde nach length
platziert, wenn es nach &buffer[index]
hätte sein sollen. Zuerst dachte ich, dass dies ein Problem mit dem Compiler ist (mit VS2013), aber nachdem ich es erfolgreich mit VS2012 und gcc 4.6.3 kompiliert habe, bin ich zu dem Schluss gekommen, dass dies aus irgendeinem Grund erlaubt ist. Der Code wird nicht unter Windows oder Linux ausgeführt, da der length-Parameter als Zeiger verwendet wird.
Also meine Frage ist, warum kompiliert sich das? Wenn ich auf die Dokumentation von reinterpret_cast
schaue, kann ich keine Dokumentation finden, die besagt, dass Sie eine kommagetrennte Liste von Werten an sie übergeben können und was sie damit machen wird.
Warum sollte es nicht kompilieren? Sie sagen dem Compiler, dass er eine 'size_t' in eine' const char * 'umwandeln soll, und das tut er. Es muss nicht sinnvoll sein, erlaubt zu werden. – Damon
Beachten Sie, dass das Aktivieren der Warnung einen starken Hinweis auf die Vorgänge gegeben hätte, wie ich in meiner Antwort anhand eines Beispiels mit 'gcc' gezeigt habe. –