2012-02-15 40 views
9

Chúng tôi (nên) biết rằng các thùng chứa thư viện chuẩn C++, bao gồm std :: string, không có nghĩa là được kế thừa từ đó. Tuy nhiên, C++ 98/03 đã cho phép chúng tôi làm điều đó ngay cả khi nó đã dẫn đến lỗi.Thùng chứa tiêu chuẩn C++ 11 là "cuối cùng"?

Giờ đây, từ khóa final có sẵn, là những thùng chứa thư viện chuẩn được đánh dấu final để ngăn việc sử dụng thừa kế xấu với chúng?

Nếu không, tại sao vậy?

Trả lời

13

LWG đã thảo luận vấn đề này tại cuộc họp gần đây tại Kona ngày 6-10 tháng 2 năm 2012. Đây là LWG issue 2113.

LWG quyết định đánh dấu LWG 2113 là NAD (không phải lỗi), với lý do là tiêu chuẩn đã rõ ràng rằng các lớp hiện có như vùng chứa và std::string không thể được đánh dấu cuối cùng bằng cách triển khai.

Thảo luận bao gồm thực tế là trong khi nó có thể được cau mày trên để lấy được từ các lớp như vậy, rõ ràng là hợp pháp để làm như vậy trong C++ 98/03. Và làm cho nó bất hợp pháp trong C++ 11 sẽ phá vỡ quá nhiều mã.

Cập nhật

Tại thời điểm này, không có loại thư viện trong current working draft được đánh dấu final.

+0

Cảm ơn bạn đã sửa chữa loại Jerry. Tôi đã có nó ở hai nơi và chỉ cần cố định thứ hai quá. Tôi sẽ không nhận thấy nó nếu không có sự giúp đỡ của bạn. –

+0

Chắc chắn. Xin lỗi tôi đã bỏ lỡ cái thứ hai. –

2

std::string dường như không được đánh dấu cuối cùng, cũng như các vùng chứa khác.

Tôi đoán là tại sao sẽ là mặc dù bắt nguồn từ chúng thường không được khuyến khích, nhưng không ai chắc chắn có bao nhiêu mã làm việc sẽ phá vỡ nếu nó bị cấm. Ngoài ra, lưu ý rằng, đối với những gì nó có giá trị, final không phải là một từ khóa chính xác - đó là một định danh mà một ý nghĩa đặc biệt được đính kèm, nhưng chỉ trong những trường hợp cụ thể. Mã có chứa một cái gì đó như int final; final = 1; sẽ vẫn hoạt động. Điều này chủ yếu là cho khả năng tương thích ngược - mặc dù ít nhất là trong mã mới, nó gần như chắc chắn tốt hơn để sử dụng final chỉ cho ý nghĩa đặc biệt, không phải là một định danh bình thường.

+2

Tôi không đồng ý với câu cuối cùng. Toàn bộ quan điểm của việc không làm cho nó một từ khóa là để có thể có các từ khóa dựa trên ngữ cảnh. Không có gì khó hiểu khi nói 'int final;' Trong bối cảnh, chúng ta biết chính xác ý nghĩa của nó, nên không có vấn đề gì cả. Nhầm lẫn sẽ chỉ xảy ra với "từ khóa" có thể xuất hiện ở cùng một vị trí như biểu thức. Và đó không phải là trường hợp ở đây. –

+0

@NicolBolas Nếu mục tiêu của bạn là chỉ hỗ trợ tô sáng cú pháp có chứa trình biên dịch C++ gần đầy đủ, thì chắc chắn. Nhưng nếu bạn tránh sử dụng các từ khóa nhạy cảm theo ngữ cảnh trong các ngữ cảnh khác trong mã trong tương lai, việc làm nổi bật cú pháp của bạn có thể chính xác mà không đòi hỏi sự phức tạp gần như nhiều. – Yakk

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