2016-08-30 7 views
7

मैं सिर्फ उत्सुक हूं कि एक enum वर्ग अंतिम हो सकता है या नहीं ... क्योंकि संकलक मुझे विरोधाभासी परिणाम दे रहे हैं।सी ++ में अंतिम enum कक्षाएं 11

कोड पर विचार करें:

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

मैं:

#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; 
} 

दृश्य स्टूडियो के साथ इस संकलन 2015 संकलक (http://rextester.com/l/cpp_online_compiler_visual) काम करता है ... लेकिन बजना के साथ यह संकलन (http://rextester.com/l/cpp_online_compiler_clang) मुझे एक त्रुटि देता है मानक में कहीं भी अंतिम एनम कक्षाओं का कोई निशान नहीं देखा है, इसलिए मैं क्लैंग को श्रेय देता हूं ... हालांकि विजुअल स्टूडियो इस मामले में क्यों स्वीकार करता है हालांकि इसका उल्लेख एमएसडीएन (https://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx) में नहीं किया गया है?

+5

और एनम पर 'अंतिम' का क्या प्रभाव होगा? – bolov

+2

[enum class] (https://msdn.microsoft.com/en-us/library/a6cskb49.aspx) दस्तावेज़ीकरण इसका उल्लेख नहीं करता है। मुझे संदेह है कि यह एक कंपाइलर बग है। – user2079303

+0

यह भी ध्यान दें कि सी ++ में कक्षा को 'char' जैसे अंतर्निहित प्रकारों से विरासत में नहीं मिलाया जा सकता है। – Sergey

उत्तर

7

final विनिर्देशक का उपयोग यह संकेत करने के लिए किया जाता है कि एक वर्ग से उत्तराधिकारी नहीं हो सकता है। चूंकि enum class विरासत में नहीं लिया जा सकता है, इसलिए final आपके मामले में उपयोग किए गए विनिर्देशक बेकार है।

here से "Stollen" और भी §7.2/p1 गणन घोषणाओं [dcl.enum] में उल्लेख है, एक class enum घोषणा फार्म के है:

enum-key attr(optional) nested-name-specifier(optional) identifier enum-base(optional) ; 
  • enum-key - enum में से एक , enum class (सी ++ 11 के बाद से), या enum struct (सी ++ 11 के बाद)
  • attr (सी ++ 11) - किसी भी संख्या का वैकल्पिक अनुक्रम श्रद्धांजलि
  • identifier - घोषित किए जाने वाले गणित का नाम। यदि मौजूद है, और यदि यह घोषणा पुन: घोषणा है, तो इससे पहले nested-name-specifier (सी ++ 11 के बाद) हो सकता है: नाम और स्कोप-रिज़ॉल्यूशन ऑपरेटरों का अनुक्रम ::, स्कोप-रिज़ॉल्यूशन ऑपरेटर के साथ समाप्त होता है। नाम केवल अनकॉल्ड गणना घोषणाओं में छोड़ा जा सकता है।
  • enum-base (सी ++ 11) - कोलन (:), type-specifier-seq के बाद जो एक अभिन्न प्रकार का नाम है (यदि यह cv-qualified है, योग्यता को अनदेखा किया जाता है)।
  • enumerator-list - गणनाकर्ता परिभाषाओं की अल्पविराम से अलग सूची, जिनमें से प्रत्येक या तो केवल एक पहचानकर्ता है, जो गणक का नाम बन जाता है, या प्रारंभकर्ता के साथ पहचानकर्ता: identifier = constexpr। किसी भी मामले में, पहचानकर्ता सीधे वैकल्पिक विशेषता विनिर्देश अनुक्रम द्वारा पीछा किया जा सकता है। (सी ++ 17 के बाद से)।

नतीजतन, के रूप में एक enum class साथ final विनिर्देशक को परिभाषित:

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

एक मानक फार्म नहीं है।

+0

बिल्कुल मेरे विचार भी ...मैं सिर्फ उत्सुक था कि क्यों एमएसवीएस इसे वाक्यविन्यास त्रुटि – fritzone

+0

@ फ़्रिट्ज़ोन के उल्लेख के बिना सक्षम बनाता है शायद कुछ कार्यान्वयन में भटक गया। – 101010

संबंधित मुद्दे