2013-05-28 36 views
5

Vì vậy, tôi có mã này:Khởi tạo thông số không const với chuỗi chữ

class ConstTest { 
public: 
    explicit ConstTest(char* name) {} 
}; 

int main() { 
    ConstTest t("blarghgh"); 
} 

Nó rõ ràng compiles, mặc dù tôi nghĩ rằng nó không nên. Vì các chuỗi ký tự trong C++ có loại const char[] và một hàm tạo ConstTest yêu cầu một số ít hơn char* - không phải const char*. Và đúc một con trỏ const đến một cái không phải là const không phải là một cái gì đó thường được thực hiện bởi C++ ngầm.

Vì vậy, tôi đã sai ở đâu? Tại sao nó biên dịch? Tôi có thể sửa đổi một cách hợp pháp con trỏ dereferenced bên trong constructor?

+0

Related: http://stackoverflow.com/questions/10268705/c-why-is-it-possible-to-assign-a-const-char-to-a-char – ulidtko

Trả lời

5

Vì vậy, nơi tôi sai? Tại sao nó biên dịch?

Nó được biên soạn bởi vì trình biên dịch của bạn là quá dễ dãi, và trình biên dịch của bạn là quá dễ dãi vì trong C++ 03 chuyển đổi ngầm từ một chuỗi chữ để char* chỉ phản, không hợp lệ.

Lý do tương thích ngược với các API C cũ. Mỗi đoạn 4.2/2 của Tiêu chuẩn C++ 03:

Một chuỗi chữ (2.13.4) đó không phải là một chuỗi rộng theo nghĩa đen có thể được chuyển đổi sang một rvalue kiểu “con trỏ đến 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ó một loại mục tiêu con trỏ thích hợp rõ ràng là và không phải khi có nhu cầu chung để chuyển đổi từ giá trị sang giá trị rvalue. [Lưu ý: chuyển đổi này không còn được dùng nữa. Xem Phụ lục D.]

Trong C++ 11, chuyển đổi ngầm là bất hợp pháp (đoạn trên đã bị xóa hoàn toàn).

Tôi có thể sửa đổi và chỉnh sửa hợp pháp con trỏ bên trong hàm tạo không?

Bạn có thể, nhưng bạn không thể sửa đổi đối tượng được đăng ký trước. Làm như vậy sẽ là hành vi không xác định, vì loại đối tượng là const đủ điều kiện.

+0

Vâng, tôi thực sự có nghĩa là truy cập đối tượng dereferenced. Cảm ơn câu trả lời! – ulidtko

+0

@ulidtko: OK, vui vì nó đã giúp. Nếu điều này trả lời câu hỏi của bạn, vui lòng xem xét đánh dấu câu hỏi đó là được chấp nhận khi bạn được phép :) –

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