2015-05-22 15 views
29

Cả hai override specifierfinal specifier đã được thêm vào C++ 11. Họ khác với specifiers khác thêm vào C++ 11 như constexprdecltype, ở chỗ chúng không keywords và như vậy là có sẵn để sử dụng như định danh:Tại sao ghi đè và nhận dạng cuối cùng có ý nghĩa đặc biệt thay vì từ khóa được đặt trước?

int main() 
{ 
    int override = 0 ; // Ok 
    int final = 0 ;  // Ok 
    //int constexpr = 0 ; // Error 
} 

Họ được gọi là định danh với ý nghĩa đặc biệt , được bao phủ trong dự thảo C++ 11 phần chuẩn 2.11[lex.name] (nhấn mạnh tôi):

các định danh trong T có thể 3 có ý nghĩa đặc biệt khi xuất hiện trong một ngữ cảnh nhất định. Khi được nhắc đến trong ngữ pháp, các số nhận dạng này được sử dụng rõ ràng hơn là sử dụng mã định danh ngữ pháp. bất kỳ sự mơ hồ nào về việc liệu số nhận dạng đã cho có một ý nghĩa đặc biệt nào được giải quyết để diễn giải mã thông báo dưới dạng số nhận dạng thông thường hay không.

Bảng 3 - định danh với ý nghĩa đặc biệt danh sách cả overridethức.

Tại sao hai specifiers những kết thúc được định danh với ý nghĩa đặc biệt thay vì từ khóa?

+1

Tôi nghĩ bạn [đã thiết lập trước] (https://stackoverflow.com/questions/30311551/is-it-undefined-behavior-to-redefine-an-identifier-with-special-meaning) rằng đó là hành vi không xác định để xác định lại định danh với ý nghĩa đặc biệt? – CoryKramer

+0

@CoryKramer Đó là cho '# define'. Mặc dù @Shafik có thể muốn làm rõ câu hỏi đó một chút. –

+0

@CoryKramer đó là khác nhau, bạn có thể không '# define' hoặc' # undef' –

Trả lời

35

Việc thêm từ khóa mới rất khó bởi vì nó sẽ lấy đi số nhận dạng từ người dùng. Nó kết thúc bằng cách chọn giữa số nhận dạng có khả năng phá vỡ mã cũ hiện đang sử dụng số nhận dạng hoặc chọn tên không có khả năng phá vỡ mã cũ nhưng là xấu xí hoặc không có ý nghĩa với cách chúng đang được sử dụng.

Trong trường hợp cụ thể này ghi đèthức cuối lên được sử dụng trong ngữ pháp ở những nơi không có định danh người dùng có thể xuất hiện. Vì vậy, ở những nơi đó, số nhận dạng có thể có ý nghĩa đặc biệt và bên ngoài các ngữ cảnh đó, chúng có thể được coi là số nhận dạng thông thường để lại số nhận dạng có sẵn cho người dùng. C++/CLI đã sử dụng kỹ thuật này kể từ 2005 và chúng được gọi là từ khóa theo ngữ cảnh nhạy cảm được bao gồm trong các phần C++/CLI standard9.1.1 Số nhận dạng.

Chúng ta có thể thấy trong phần ghi địa chỉ giao dịch của các phương thức hỗ trợ khác nhau cho các thuộc tính điều khiển ảo trong N3163: Override Control Using Contextual Keywords.Nó đã thảo luận ba lựa chọn:

  • Sử dụng [[attributes]], được coi là không mong muốn vì những lý do kể cả họ chỉ là những từ khóa trong ngụy trang (dụ sửa đổi từ giấy dưới đây):

    class A : public B { 
        virtual void f [[override]]() { ... } 
        virtual void h [[final]]() { ... } 
    }; 
    
  • Sử dụng các từ khóa dành riêng, có khả năng ngắt mã hiện tại trừ khi tên xấu xí được chọn (modifi ed ví dụ từ giấy dưới đây):

    class A : public B { 
        virtual void f override_func() { ... } 
        virtual void h final_func() { ... } 
    }; 
    
  • Sử dụng từ khóa bối cảnh nhạy cảm, mà không phá vỡ mã hiện tại cho phép tên đẹp (sửa đổi ví dụ từ giấy dưới đây):

    class A : public B { 
        virtual void f() override { ... } 
        virtual void h() final { ... } 
    }; 
    

Đoạn sau đây từ tờ báo tổng kết lý luận cho việc sử dụng bối cảnh từ khóa nhạy cảm trong hai lựa chọn khác (tôi nhấn mạnh):

Các quan sát đã được thực hiện ở Rapperswil rằng phương pháp này có thể làm cho phục hồi lỗi và làm nổi bật cú pháp khó khăn hơn. Ví dụ: làm nổi bật cú pháp hơi khó hơn vì thay vì trên toàn cầu, hãy làm nổi bật từ khóa bạn cần phải phân tích cú pháp để biết liệu mã định danh có ở vị trí có ý nghĩa đặc biệt không và nên đánh dấu . Nhưng điều này không phải là đặc biệt khó khăn, đặc biệt là không so với những thứ khó khăn khác mà chúng tôi đã có để làm trong C++ so với các ngôn ngữ khác.

Đây là sự bất tiện nhỏ đối với một vài nhà biên dịch trình biên dịch trong một tuần, nhưng liền mạch cho người dùng. Đây là sự cân bằng quyền. Nếu không, có tên được dành riêng trên toàn cầu xấu xí (Tùy chọn 2) hoặc không phù hợp và được hiển thị rõ ràng - trên thuộc tính (Tùy chọn 1) giúp mọi người dễ dàng hơn trong vài tuần. với mãi mãi.

Thay đổi được áp dụng cho tiêu chuẩn qua N3206: Override control: Eliminating AttributesN3272: Follow-up on override control.

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