Mục 9.6/3 trong C++ 11 rõ ràng là bất thường: "Một tham chiếu không const sẽ không bị ràng buộc vào một trường bit." Động lực đằng sau lệnh cấm này là gì?Tại sao các tham chiếu không phải const tham chiếu đến bitfield bị cấm?
Tôi hiểu rằng không thể trực tiếp ràng buộc tham chiếu đến bitfield. Nhưng nếu tôi tuyên bố điều gì đó như thế này,
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
tại sao tôi không thể nói điều này?
IPv4Header h;
auto& ecn = h.ECN;
tôi mong đợi các mã cơ bản để thực sự liên kết với toàn bộ std::uint32_t
có chứa các bit Tôi quan tâm đến, và tôi mong đợi đọc và ghi các hoạt động để tạo ra mã để làm mặt nạ thích hợp. Kết quả có thể lớn và chậm, nhưng có vẻ như với tôi rằng nó sẽ hoạt động. Đây sẽ là phù hợp với đường tiêu chuẩn nói rằng tài liệu tham khảo để const
bitfields công việc (một lần nữa từ 9,6/3):
Nếu initializer cho một tham chiếu kiểu const T & là một giá trị trái nó liên quan tới một chút -field, tham chiếu được ràng buộc với một tạm thời được khởi tạo để giữ giá trị của trường bit; tham chiếu không bị ràng buộc trực tiếp vào trường bit.
Điều này gợi ý rằng việc ghi vào bitfield là vấn đề, nhưng tôi không thấy nó là gì. Tôi đã xem xét khả năng mặt nạ cần thiết có thể giới thiệu các chủng tộc trong mã đa luồng, nhưng, trên 1,7/3, bitfield liền kề có chiều rộng khác 0 được coi là một đối tượng duy nhất cho mục đích đa luồng. Trong ví dụ trên, tất cả các bitfield trong một đối tượng IPv4Header
sẽ được coi là một đối tượng duy nhất, vì vậy mã đa luồng cố gắng sửa đổi một trường trong khi đọc các trường khác theo định nghĩa, đã được cải thiện.
Tôi rõ ràng thiếu điều gì đó. Nó là gì?
Tôi đánh dấu đây là câu trả lời, bởi vì nó làm cho rõ ràng những gì tôi nghĩ là đối số chính: rằng nếu một tham chiếu đến từ giữ một bitfield đã làm việc theo cách tôi phác thảo, sẽ có một nhu cầu bổ sung thông tin liên quan đến bù đắp của bitfield vào từ, và đó là không thực tế thực hiện được cho các mô hình tham khảo-là-con trỏ-dưới-mui xe mà C++ sử dụng. – KnowItAllWannabe