Thực tế, "hello"
là loại char const[6]
.
Nhưng ý chính của câu hỏi vẫn đúng - tại sao C++ cho phép chúng tôi chỉ định vị trí bộ nhớ chỉ đọc cho loại không phải là const
?
Lý do duy nhất cho điều này là khả năng tương thích ngược với mã C cũ, không biết const
. Nếu C++ đã được nghiêm ngặt ở đây nó sẽ bị phá vỡ rất nhiều mã hiện có.
Điều đó nói rằng, hầu hết các trình biên dịch có thể được định cấu hình thành cảnh báo về mã như bị phản đối hoặc thậm chí làm như vậy theo mặc định. Hơn nữa, C++ 11 không cho phép điều này hoàn toàn nhưng các trình biên dịch có thể không thực thi nó.
cho người hâm mộ Standerdese:
[Ref 1]C++ 03 Tiêu chuẩn: §4.2/2
Một chuỗi chữ (2.13.4) mà không phải là một rộng chuỗi chữ có thể được chuyển đổi thành một rvalue thuộc loại “pointer to char”; một chuỗi ký tự lớn có thể được chuyển đổi thành một giá trị rvalue kiểu "pointer to wchar_t". Trong cả hai trường hợp, kết quả là một con trỏ đến phần tử đầu tiên của mảng. Chuyển đổi này chỉ được xem xét khi có loại mục tiêu con trỏ thích hợp rõ ràng và không phải khi có nhu cầu chung để chuyển đổi từ một giá trị thành giá trị. [Lưu ý: chuyển đổi này không được dùng nữa. Xem Phụ lục D.] Với mục đích xếp hạng ở độ phân giải quá tải (13.3.3.1.1), chuyển đổi này được coi là chuyển đổi mảng thành con trỏ, sau đó là chuyển đổi tiêu chuẩn (4.4). [Ví dụ: "abc" được chuyển thành "con trỏ thành const char" dưới dạng chuyển đổi mảng thành con trỏ và sau đó là "con trỏ thành char" làm chuyển đổi đủ điều kiện. ]
C++ 11 chỉ đơn giản loại bỏ báo giá ở trên ngụ ý rằng đó là mã bất hợp pháp trong C++ 11.
[Ref 2]C99 tiêu chuẩn 6.4.5/5 "Chuỗi Literals - Semantics":
Trong giai đoạn dịch 7, một byte hoặc mã có giá trị không được gắn cho mỗi ký tự multibyte chuỗi kết quả từ chuỗi ký tự hoặc chữ. Chuỗi ký tự multibyte sau đó được sử dụng để khởi tạo một mảng thời gian lưu trữ tĩnh và độ dài vừa đủ để chứa chuỗi.Đối với các chuỗi ký tự chuỗi ký tự, các phần tử mảng có kiểu char và được khởi tạo với các byte riêng lẻ của chuỗi ký tự nhiều byte; đối với các chuỗi ký tự chuỗi rộng, các phần tử mảng có kiểu wchar_t và được khởi tạo với chuỗi ký tự rộng ...
Không xác định xem các mảng này có khác biệt hay không. Nếu chương trình tìm cách sửa đổi một mảng như vậy, hành vi không xác định.
Nguồn
2012-04-22 14:19:20
Điều này chỉ được phép cho khả năng tương thích với C. Nói chung trong C++ nó được coi là không được chấp nhận và trình biên dịch tốt cho cảnh báo. – iammilind