C++ 11のセクション9.6/3は、「非const参照はビットフィールドにバインドされてはなりません。この禁止の背後にある動機は何ですか?ビットフィールドへの非const参照が禁止されているのはなぜですか?
私は、ビットフィールドへの参照を直接バインドすることはできないことを理解します。しかし、このような宣言をすると、
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
なぜ私はこれを言うことができないのですか?
IPv4Header h;
auto& ecn = h.ECN;
は、私は、基礎となるコードは実際に私が興味のビットが含まれています全体std::uint32_t
に特異的に結合することを期待したい、と私は、読み取りおよび書き込み操作が適切なマスキングを行うためのコードを生成することを期待したいです。結果は大きくて遅いかもしれませんが、それはうまくいくはずです。タイプCONSTの参照 T &の初期化子は、ビットを指す左辺値である場合
:これは標準
const
ビットフィールドへの参照は、(再び9.6/3から)動作することを言う方法と一致するであろう-field、参照はビットフィールドの値を保持する に初期化された一時的にバインドされています。参照はビットフィールドに直接バインドされません。
これはビットフィールドへの書き込みが問題であることを示していますが、私はそれが何かを見ていません。私は、必要なマスキングがマルチスレッドコードにレースを導入する可能性を考えましたが、1.7/3あたり、非ゼロ幅の隣接ビットフィールドはマルチスレッドの目的で単一のオブジェクトとみなされます。上記の例では、IPv4Header
オブジェクト内のすべてのビットフィールドは単一のオブジェクトと見なされるため、他のフィールドを読み取っている間にフィールドを変更しようとするマルチスレッドコードは、定義上既にレイシーになっています。
私は明らかに何かが不足しています。それは何ですか?
私はこれを答えとしてマークしています。なぜなら、私が主張していることを明白にしているからです。ビットフィールドを持つ単語への参照が、私がスケッチしたやり方で動作するならば、ビットフィールドの単語へのオフセット。C++で採用されているリファレンス参照ポインタの場合は、実際には実装できません。 – KnowItAllWannabe