Bạn đang hỏi "Tại sao trình biên dịch phiên dịch (2) lại giống như (3)?". Vâng, bởi vì trong ngôn ngữ C++ (cũng như trong C) họ là ngữ nghĩa giống nhau.Khi bạn định nghĩa một typename như
typedef int *IntPtr;
sau đó loại const IntPtr
sẽ đại diện cho int *const
, không phải cho const int *
. Đó chỉ là cách typedef-tên làm việc trong C + +.
Tên đã nhập trong C++ không phải là macro. Mặc dù chúng không xác định các kiểu mới (chỉ là bí danh cho các kiểu hiện có), nhưng các bí danh kết quả vẫn là "nguyên tử", "nguyên khối" theo nghĩa nào đó bất kỳ vòng loại nào được áp dụng cho bí danh sẽ áp dụng là vòng loại cấp cao nhất. Khi bạn đang làm việc với một typedef tên, không có cách nào để "lẻn vào" một vòng loại const để nó bằng cách nào đó sẽ "xuống" đến một phần cấp thấp hơn của loại (int
trong trường hợp của bạn).
Nếu bạn nhấn mạnh vào việc sử dụng typedef-tên, bạn không có sự lựa chọn trực tiếp nào khác ngoài việc cung cấp hai typedef-tên gọi khác nhau, như
typedef int *IntPtr;
typedef const int *ConstIntPtr;
và sử dụng ConstIntPtr
khi bạn cần một phiên bản con trỏ-to-const của loại.
+1, câu trả lời hay :-) –