2016-08-30 18 views
7

コンパイラが矛盾した結果を出すので、enumクラスが最終的なものかどうか不思議です。しかし、打ち鳴らす(http://rextester.com/l/cpp_online_compiler_clang)とそれをコンパイルすることは私にエラーを与える...のVisual Studio 2015のコンパイラ(http://rextester.com/l/cpp_online_compiler_visual)が働くとC++での最後の列挙型クラス

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

がこれをコンパイル:

は、コードを考えてみましょう

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

I標準のどこでも最終列挙クラスの痕跡は見られませんでしたので、私は信じています...しかし、Visual StudioはMSDN(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

C++では、 'char'のような組み込み型からクラスを継承することはできません。 – Sergey

答えて

7

final指定子は、クラスが継承できないことを示すために使用されます。 enum classは継承できないため、final指定子は使用できません。

hereから

"シュトーレン" とも§7.2/ P1列挙宣言[dcl.enum] に言及し、class enum宣言の形式のものである:

enum-key attr(optional) nested-name-specifier(optional) identifier enum-base(optional) ; 
  • enum-key - enumの一つ、enum class(C++ 11以降)、またはenum struct(C++ 11以降)
  • attr(C++ 11) - 任意の賛辞
  • identifier - 宣言されている列挙体の名前。存在する場合、この宣言が再宣言である場合は、nested-name-specifier(C++ 11以降)の名前とスコープ解決演算子::のシーケンスがスコープ解決演算子で終わることがあります。名前は、スコープなしの列挙宣言でのみ省略できます。
  • enum-base(C++ 11) - コロン(:)、type-specifier-seq(整数の場合はcv-qualifiedの場合、修飾は無視されます)。
  • enumerator-list - 列挙子の名前のカンマ区切りのリスト。各列挙子の名前は、列挙子の名前になります。識別子は、初期化子:identifier = constexprです。どちらの場合でも、識別子の直後にオプションの属性指定子シーケンスを続けることができます。 (C++ 17以降)。

したがって、としてenum classfinalと指定子を定義:

​​

、標準形式ではありません。

+0

まさに私の考えです...なぜMSVSが文法エラーの言及なしでそれを可能にするのか不思議でした – fritzone

+0

@fritzoneおそらく実装に迷っています。 – 101010