2013-03-12 25 views
13

Theo chuẩn C++ một chuỗi loại đen là array of const charC++ đúng đắn const với xâu

auto constStr = "aaa"; 
char* nonConstStr = constStr; //Error here, cannot convert from 'const char *' to 'char *' 
char* stillNonConstStr = "aaa"; //Why I don't have error here? 

bạn có thể vui lòng giải thích cho tôi tại sao trên dòng thứ 3 tôi không nhận được một lỗi?

+1

@Rapptz Tôi dường như không thể tìm thấy cùng một mệnh đề cho phép "chuyển đổi tương thích ngược" giống nhau trong tiêu chuẩn C++ 11. Tôi đoán nó đã được gỡ bỏ, do đó, câu hỏi liên kết không thực sự là một bản sao ngày nay. – Angew

+0

Bởi vì nó là thích hợp hơn để cho phép nó như nó đã được cho phép trong lịch sử hơn để phá vỡ hàng ngàn chương trình hiện có. –

+3

@Rapptz Câu hỏi + câu trả lời về C trùng lặp một câu hỏi về C++ như thế nào? Đặc biệt là trong một khu vực mà hai ngôn ngữ thực sự khác nhau. – Angew

Trả lời

12

Trong C++ 03, có một quy tắc đặc biệt ([conv.array] §2) cho phép các chuỗi ký tự chuỗi được chuyển đổi thành loại char*.

Trong C++ 11, quy tắc này không còn tồn tại. Nói cách khác, mã của bạn là hợp lệ C++ 03, nhưng không hợp lệ C++ 11.

+0

* illformed * hoặc * deprecated * C++ 11. Không hợp lệ. Điều này vẫn sẽ biên dịch vì lý do lịch sử. [Xem ở đây mà không có -Wall] (http://ideone.com/Itv8Hz) hoặc [ở đây với -Wall -Werror] (http://coliru.stacked-crooked.com/view?id=bf8d5e2bc40d1220813841a85bfdbe25-18aa934a8d82d638dde2147aa94cac94) – Rapptz

+7

@ Rapptz: illformed == không hợp lệ. –

+2

@Rapptz Hãy coi chừng, * không đúng định dạng *! = * Không dùng nữa *, * "không dùng nữa" * mọi thứ hoạt động nhưng không được khuyến khích, * "bị sai" * (và * "không hợp lệ" *, như * Benjamin * nói) mọi thứ * không * công việc. –

14

Lý do lịch sử. Nó được sử dụng để được cho phép, và rất phổ biến, để gán từ một chuỗi ký tự cho một char*, mặc dù kiểu của một chuỗi ký tự là một mảng của const char. Tôi tin rằng nó đến từ những ngày trong C trong đó const không tồn tại, nhưng không báo cho tôi về điều đó. Sau đó nó không được dùng nữa, nhưng vẫn được cho phép để không phá vỡ các codebases sử dụng nó. Phụ cấp đó không mở rộng để cho phép char* được khởi tạo từ const char* (cũng không phải từ mảng const char không phải là chữ), đó là lý do tại sao dòng thứ hai của bạn không thành công. Trong C++ 11, việc chuyển đổi từ chuỗi ký tự thành char* bị cấm, nhưng trình biên dịch của bạn có thể không thực thi điều đó.

Các vấn đề liên quan