2017-12-07 16 views
1

これはちょっと変わった質問かもしれませんが、私は本当にこれよりもフレーズをどのようにするかわかりません。C++で括弧付きのenum/enumクラスを呼び出すとどうなりますか?

私はちょうど私が次の操作を行うことができますことを発見:

#include <iostream> 

enum class Colour // also works with plain old enum 
{ 
    Red = 1, 
    Green, 
    Blue, 
    Yellow, 
    Black, 
    White 
}; 

int main() 
{ 
    Colour c = Colour(15); // this is the line I don't quite understand 

    std::cout << static_cast<int>(c) << std::endl; // this returns 15 

    return 0; 
} 

だから今、私はタイプColourの変数に整数値15を持っています。

ここでは正確に何が起こっていますか?その仕事の列挙型の "コンストラクタ"のいくつかの種類ですか?私の知る限り、整数値15は列挙されません。変数cに格納されます。なぜ、そのようなものが、最初はenumに存在しない値を作成するのに便利なのでしょうか?

+0

これはCスタイルのキャスト '(Color)15 'を書くもう一つの方法です。 – cpplearner

答えて

2

Colour(15)15で初期化Colour列挙の一時(prvalue)インスタンスを作成する式です。

Colour c = Colour(15);は、Colourの新しい変数cを前述の式から初期化します。これはColour c(15)に相当します。

2

ここで起こっているのは、明示的にキャストしたりデフォルトで初期化した場合でも、範囲外の値を保持することができるC++ 11の厳密に型指定された列挙型です。あなたの例では、Colour c = Colour(15);は完全に有効ですが、Colourは1-6の意味のある値しか持っていません。

+2

'Colour'には、1-6の**名前付き**値しかありません。これは他の値が意味を持たないことを意味するものではなく、単に名前を持たないということです。 'enum mask {read = 1、write = 2、hidden = 4};'現在の 'mask(read + write)'は値3を持ち、話すことは読んだり書いたりすることができます。 –

関連する問題