Abschnitt 9.6/3 in C++ 11 ist ungewöhnlich klar: "Eine nicht-const Referenz soll nicht an ein Bit-Feld gebunden sein." Was ist die Motivation hinter diesem Verbot?Warum sind nichtkonstante Verweise auf Bitfelder verboten?
Ich verstehe, dass es nicht möglich ist, eine Referenz direkt an ein Bitfeld zu binden. Aber wenn ich so etwas erkläre,
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
Warum kann ich das nicht sagen?
IPv4Header h;
auto& ecn = h.ECN;
würde ich der zugrunde liegende Code eigentlich erwartet, dass auf die gesamten std::uint32_t
zu binden, die die Bits enthalten Ich habe Interesse an, und ich würde erwarten, dass Lese- und Schreiboperationen Code erzeugen, um die entsprechende Maskierung zu tun. Das Ergebnis könnte groß und langsam sein, aber es scheint mir, dass es funktionieren sollte. Dies würde mit der Art und Weise im Einklang die Norm sagen, dass Verweise auf const
bitfields Arbeit (wieder von 9.6/3):
Wenn der Initialisierer für eine Referenz vom Typ const T & ein L-Wert ist, der auf ein Bit verweist -Feld, die Referenz ist an eine temporäre initialisiert an halten Sie den Wert des Bit-Feld; Die Referenz ist nicht direkt an das Bitfeld gebunden.
Dies legt nahe, dass das Schreiben in Bitfelder das Problem ist, aber ich sehe nicht, was es ist. Ich betrachtete die Möglichkeit, dass die notwendige Maskierung Rassen in Multithreading-Code einführen könnte, aber pro 1,7/3 werden benachbarte Bitfelder mit einer Breite ungleich null als ein einzelnes Objekt für Multithreading betrachtet. Im obigen Beispiel würden alle Bitfelder in einem IPv4Header
Objekt als ein einzelnes Objekt betrachtet werden, so dass Multithread-Code, der versucht, ein Feld zu ändern, während andere Felder gelesen werden, per Definition bereits rassig wäre.
Ich bin eindeutig etwas fehlt. Was ist es?
Ich bezeichne dies als die Antwort, weil es deutlich macht, was ich für das Schlüsselargument halte: Wenn ein Verweis auf das Wort, das ein Bitfeld enthält, so funktionieren würde, wie ich skizziert habe, wären zusätzliche Informationen über die Offset des Bitfelds in das Wort, und das ist nicht praktisch implementierbar angesichts der Referenzen-sind-Zeiger-Under-the-Hood-Modell, das C++ verwendet. – KnowItAllWannabe