2017-04-21 13 views
17

C++ (và C) quy tắc bí danh nghiêm ngặt bao gồm rằng char*unsigned char* có thể bí danh bất kỳ con trỏ nào khác.Có một std :: byte con trỏ cùng một ý nghĩa răng cưa như char *?

AFAIK không có quy tắc tương tự cho uint8_t*.

Vì vậy, câu hỏi của tôi: Quy tắc bí danh cho con trỏ std::byte là gì?

C++ tài liệu tham khảo hiện nay chỉ specifies:

Giống như các loại ký tự (char, unsigned char, ký char) nó có thể được sử dụng để truy cập vào bộ nhớ nguyên bị chiếm đóng bởi các đối tượng khác (đại diện đối tượng), nhưng không giống như những các loại, nó không phải là một loại ký tự và không phải là một loại số học.

+4

http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing Các quy tắc răng cưa cùng áp dụng cho 'std :: byte' như cho' char' – Justin

+2

@Justin: Bạn có thể muốn để rõ ràng hơn một chút, vì "các quy tắc được áp dụng" không nói những quy tắc nào được áp dụng. 'std :: byte' có cùng các quy tắc như' char' và 'unsigned char'. – ShadowRanger

+0

@Justin: Không phải khi bạn đăng lần đầu (bạn có: "en.cppreference.com/w/cpp/language/… Các quy tắc bí danh áp dụng cho' std :: byte' "). Bạn đã chỉnh sửa; Tôi đã tải trước khi chỉnh sửa. Cảm ơn bạn đã sửa. – ShadowRanger

Trả lời

14

Từ dự thảo tiêu chuẩn hiện hành ([basic.types]/2):

Đối với bất kỳ đối tượng (trừ một subobject cơ sở-class) của trivially copyable loại T, hay không đối tượng nắm giữ một giá trị hợp lệ của loại T, các byte tiềm ẩn ([intro.memory]) chiếm các đối tượng có thể được sao chép vào một mảng của char, unsigned char, hay std :: byte ([cstddef .syn]). Nếu nội dung của mảng đó được sao chép trở lại thành đối tượng, đối tượng sau đó sẽ giữ giá trị ban đầu của nó.

Vì vậy, có, cùng một quy tắc đánh răng áp dụng cho ba loại, giống như cppreference tổng hợp.

Nó cũng có thể là giá trị đề cập đến ([basic.lval] /8.8):

Nếu một chương trình cố gắng truy cập vào các giá trị được lưu trữ của một đối tượng thông qua một glvalue của khác hơn là một trong những cách sau loại hành vi là không xác định:

  • char, unsigned char hoặc std :: byte type.
Các vấn đề liên quan