La sezione 9.6/3 in C++ 11 è insolitamente chiara: "Un riferimento non const non deve essere associato a un campo di bit". Qual è la motivazione dietro questo divieto?Perché i riferimenti non costanti ai bitfield sono proibiti?
Capisco che non è possibile associare direttamente un riferimento a un campo bit. Ma se dichiaro qualcosa del genere,
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
perché non posso dirlo?
IPv4Header h;
auto& ecn = h.ECN;
mi aspetto il codice sottostante per legare in realtà a tutta la std::uint32_t
che contiene i bit che mi interessano, e mi aspetto lettura e scrittura per generare il codice per fare il mascheramento appropriata. Il risultato potrebbe essere grande e lento, ma mi sembra che dovrebbe funzionare. Ciò sarebbe coerente con il modo dire la standard che i riferimenti al const
bitfields lavoro (sempre da 9,6/3):
Se l'inizializzatore per un riferimento di tipo const T & è un Ivalue che si riferisce a un bit -field, il riferimento è legato a un provvisorio inizializzato a mantenere il valore del campo-bit; il riferimento non è legato direttamente al campo di bit.
Questo suggerisce che scrivere su bitfield è il problema, ma non vedo cosa sia. Ho considerato la possibilità che il mascheramento necessario potesse introdurre razze in codice multithread, ma, per 1.7/3, campi di bit adiacenti di larghezza diversa da zero sono considerati un singolo oggetto ai fini del multithreading. Nell'esempio sopra, tutti i bitfield in un oggetto IPv4Header
sarebbero considerati un singolo oggetto, pertanto il codice multithreading che tenta di modificare un campo durante la lettura di altri campi sarebbe, per definizione, già molto competitivo.
Mi manca chiaramente qualcosa. Che cos'è?
La segnalo come risposta, perché rende esplicito quello che penso sia l'argomento chiave: se un riferimento alla parola che tiene un bitfield dovesse funzionare come ho abbozzato, ci sarebbe bisogno di ulteriori informazioni riguardo al offset del bitfield nella parola, e questo non è praticamente implementabile dato il modello di riferimento-i-pointers-under-the-hood che impiega C++. – KnowItAllWannabe