2017-01-13 26 views
6

Tôi bằng cách nào đó đã bỏ lỡ các thuộc tính đã được giới thiệu trong C++ 11. Bây giờ tôi phát hiện ra, tôi tự hỏi tại sao overridefinal được thêm làm số nhận dạng với ý nghĩa đặc biệt chứ không phải là thuộc tính chuẩn.Tại sao ghi đè C++ 11 và thuộc tính cuối cùng không phải là thuộc tính?

Mục đích của override là tạo ra lỗi thời gian biên dịch và đây cũng là mục đích của nhiều thuộc tính tiêu chuẩn. Nó cảm thấy như thể họ sẽ phù hợp với khái niệm đó nhưng có lẽ có một lý do cho nó mà tôi đang thiếu.

+0

Tại sao 'noexcept' không phải là một? Câu hỏi về vũ trụ. –

+0

"đây cũng là mục đích của nhiều thuộc tính tiêu chuẩn" thực sự? Cái nào? –

+0

@GillBates Vì nó là một biểu thức có giá trị trả về? – ygram

Trả lời

7

Họ, một lần, trước khi họ bị thay đổi để đáp ứng với bình luận US 44 trên C++ 11 của FCD:

Thậm chí nếu thuộc tính tiếp tục được chuẩn hóa trên tiếp tục phản bác từ cả hai nhà cung cấp người được trích dẫn là hiệu trưởng chính thức của , chúng tôi có thể sống với chúng ngoại trừ các điều khiển ghi đè ảo . Kết quả này chỉ là khủng khiếp, như đã thể hiện trong ví dụ trong 7.6.5 (trích):

class D [[base_check]] : public B { 
    void some_func [[override]](); 
    virtual void h [[hiding]] (char*); 
}; 

Ở đây chúng ta có sáu từ khóa (không kể voidchar): ba bình thường từ khóa, và ba [[decorated]] từ khóa . Đã có chế nhạo công khai của C++ 0x về sự xấu xí này. Đây chỉ là thiết kế ngôn ngữ nghèo nàn , ngay cả khi đối mặt với các mối quan tâm tương thích ngược (ví dụ: một số mã hiện có có thể đã sử dụng các từ đó làm số nhận dạng ). phía dưới). Quan trọng hơn, đây là chính xác việc lạm dụng thuộc tính là từ khóa được che giấu là phản đối và được hứa hẹn không xảy ra để nhận được đề xuất này được thông qua. Việc sử dụng các thuộc tính cho điều khiển ảo từ khóa là lạm dụng nghiêm trọng nhất của cú pháp thuộc tính và ở mức ít nhất việc sử dụng thuộc tính phải được sửa bằng cách thay thế chúng bằng cú pháp không thuộc tính . Các điều khiển ghi đè ảo này là ngôn ngữ tính năng, không phải là chú thích.

Có thể có những cái tên đẹp và không mâu thuẫn với mã hiện tại bằng cách sử dụng từ khóa theo ngữ cảnh, chẳng hạn như nhận lời là có ý nghĩa đặc biệt khi nó xuất hiện trong một vị trí ngữ pháp mà không có định danh người dùng có thể xuất hiện, như chứng minh trong C++/CLI có năm năm của lĩnh vực thực tế kinh nghiệm với một số lượng lớn khách hàng (và chính xác không có tên xung đột hay lập trình viên nhầm lẫn vấn đề báo cáo trong lĩnh vực này trong năm năm này đã có sẵn):

class D : public B { 
    void some_func() override; // same meaning as [[override]] - explicit override 
    virtual void h (char*) new; // same meaning as [[hiding]] - a new function, not an override 
}; 
int override = 42; // ok, override is not a reserved keyword 

Các hình thức trên có thể thực hiện được, đã được triển khai, có năm trải nghiệm thực tế và hoạt động. Các nhà phát triển yêu thích họ. Cho dù câu trả lời là để thực hiện theo thực tiễn hiện tại này hay cái gì khác, cần có sự thay thế tự nhiên hơn cho các từ khóa hiện tại là [[attributed]] cho điều khiển ghi đè ảo, đây là một trải nghiệm không có kinh nghiệm thực tế và các nhà phát triển đã chế nhạo.

0

Để đơn giản trích dẫn http://en.cppreference.com/w/cpp/language/attributes:

Thuộc tính cung cấp cú pháp chuẩn thống nhất cho các phần mở rộng thực hiện xác định ngôn ngữ, chẳng hạn như mở rộng ngôn ngữ GNU và IBM thuộc tính ((...)), Microsoft mở rộng __declspec(), v.v.

Điều này làm cho nó khá rõ ràng rằng từ khóa ngôn ngữ chuẩn không phải là thuộc tính.

+0

Tôi nghĩ câu hỏi đặt ra là * tại sao * những từ khóa đó là từ khóa, thay vì được triển khai dưới dạng thuộc tính, chẳng hạn như các thuộc tính tiêu chuẩn khác như '[[noreturn]]'. –

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