2016-08-30 31 views
7

Tôi chỉ tò mò liệu một lớp enum có thể là cuối cùng hay không ... vì các trình biên dịch đang cho tôi kết quả mâu thuẫn.Lớp enum cuối cùng trong C++ 11

xem xét mã:

#include <iostream> 

enum class some_enums final : char 
{ 
    a = 'a', 
    b = 'b', 
    c = 'c' 
}; 

int main() 
{ 
    some_enums aa = some_enums::a; 
    std::cout << "aa=" << static_cast<char>(aa) << std::endl; 
} 

Biên dịch này với Visual Studio 2015 biên dịch (http://rextester.com/l/cpp_online_compiler_visual) hoạt động ... Tuy nhiên biên dịch nó với kêu vang (http://rextester.com/l/cpp_online_compiler_clang) mang lại cho tôi một lỗi:

source_file.cpp:3:30: error: expected ';' after top level declarator 
     enum class some_enums final : char 

tôi đã thấy không có dấu vết của lớp enum cuối cùng bất cứ nơi nào trong tiêu chuẩn vì vậy tôi cho tín dụng để kêu vang ... Tuy nhiên tại sao Visual Studio chấp nhận nó trong trường hợp này mặc dù nó không được đề cập trong MSDN (https://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx)?

+5

và tác động của 'final' sẽ có trong enum? – bolov

+2

[enum class] (https://msdn.microsoft.com/en-us/library/a6cskb49.aspx) tài liệu cũng không đề cập đến nó. Tôi nghi ngờ rằng đây là lỗi trình biên dịch. – user2079303

+0

Cũng lưu ý rằng trong C++ một lớp không thể được kế thừa từ các kiểu dựng sẵn như 'char'. – Sergey

Trả lời

7

Trình chỉ định final được sử dụng để biểu thị rằng không thể kế thừa lớp học. Vì không thể kế thừa một số enum class, chỉ định final được sử dụng trong trường hợp của bạn là vô dụng.

"Stollen" từ here và cũng đề cập đến trong tờ khai §7.2/p1 Enumeration [dcl.enum] , một tuyên bố class enum có dạng:

enum-key attr(optional) nested-name-specifier(optional) identifier enum-base(optional) ; 
  • enum-key - một trong những enum , enum class (kể từ C++ 11) hoặc enum struct (kể từ C++ 11)
  • attr (C++ 11) - chuỗi tùy chọn của bất kỳ số nào tại tributes
  • identifier - tên của điều tra đang được khai báo. Nếu có, và nếu tuyên bố này là khai báo lại, nó có thể được bắt đầu bằng nested-name-specifier (kể từ C++ 11): chuỗi tên và toán tử phân giải phạm vi ::, kết thúc với toán tử phân giải phạm vi. Tên có thể được bỏ qua chỉ trong khai báo liệt kê chưa được kiểm duyệt.
  • enum-base (C++ 11) - dấu hai chấm (:), theo sau là type-specifier-seq đặt tên cho loại tích phân (nếu là cv-qualified, thì trình độ sẽ bị bỏ qua).
  • enumerator-list - danh sách định nghĩa bảng liệt kê bằng dấu phẩy, mỗi định danh đơn giản là số nhận dạng, trở thành tên của điều tra viên hoặc số nhận dạng có bộ khởi tạo: identifier = constexpr. Trong cả hai trường hợp, số nhận dạng có thể được theo sau bởi chuỗi trình tự thuộc tính tùy chọn. (kể từ C++ 17).

Do đó, việc xác định một specifier enum class với final như:

enum class some_enums final : char { 
... 
}; 

không phải là một hình thức tiêu chuẩn.

+0

Chính xác suy nghĩ của tôi nữa ...Tôi đã chỉ tò mò tại sao MSVS cho phép nó mà không có một đề cập đến lỗi cú pháp – fritzone

+0

@fritzone Có lẽ một cái gì đó đã lạc lối trong việc thực hiện. – 101010

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