2011-06-27 60 views
6

Mã sau đây có hợp pháp, không được chấp nhận hoặc bất hợp pháp trong C++ 0x không?Gán chuỗi ký tự cho char *

char* p = "foobar"; 

Tôi đã hỏi câu hỏi này here làm nhận xét.

+3

Nó tiếp tục hoạt động và tiếp tục kém phong cách. –

+0

GCC 4.6 cho biết "không được chuyển đổi từ chuỗi không đổi thành char *". –

+0

tốt, phải là 'const char *', chính xác hơn là –

Trả lời

14

Việc quy đổi

char* p = "foobar"; 

bị phản đối trong C++ 98/C++ 03, và đã bị xóa (có nghĩa là, §4.2/2 bị loại bỏ) trong C++ 0x.

Vì vậy, mã là không hợp lệ bằng C++ 0x.

Tuy nhiên, MinGW g ++ 4.4.1 vẫn chỉ phát ra cảnh báo chứ không phải lỗi.

C++ 98/C++ 03 §4.2/2 (mà được lấy ra trong C++ 0x):


Một chuỗi chữ (2.13.4) mà không phải là một rộng chuỗi chữ lon được chuyển đổi thành giá trị của loại “con trỏ thành char”; một chuỗi ký tự lớn có thể được chuyển đổi thành một giá trị của loại “con trỏ tới 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òn đượ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ỏ đến char" làm chuyển đổi đủ điều kiện. ]

+0

Ngay cả g ++ 4.4.5 với '-std = C++ 0x' chỉ phát ra cảnh báo. –

+0

Vì vậy, §4.2/2 ban đầu về chuỗi ký tự để chuyển đổi 'char *', tôi giả sử? Sẽ được mát mẻ nếu bạn có thể bao gồm đoạn đó từ tiêu chuẩn C++ 03 làm báo giá, nếu có thể :) – fredoverflow

+1

@Fred: Tôi đã thêm đoạn văn từ C++ 03. @ Alf: Tôi hy vọng đó là Ok với bạn. – sbi

2

Tôi tin rằng điều này bây giờ là bất hợp pháp trong C++ 0x. C++ 03 có một cảnh báo đặc biệt cho việc chuyển đổi này cho mã kế thừa, nhưng C++ 0x đã loại bỏ nó và bây giờ bạn đang vi phạm chính xác const.

Tất nhiên, tôi không biết liệu có bất kỳ trình biên dịch thực nào đã loại bỏ nó hay không, nhưng chúng sẽ tốt trong quyền của họ.

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