2016-06-29 3 views
5

私はそうのような列挙型を定義する場合は、次のようにのようなブールから1を構築しようとし、その後ブール型の基礎となる "bool"型の列挙型を構築していますか?

enum Foo : bool { Left = false, Right = true }; 

int main (int ac, const char **av) { 
    Foo foo (ac > 1); 
    cout << boolalpha << bool(foo) << endl; 
    return 0; 
} 

それは失敗しますが、そのような余分なコンストラクタで動作します:

Foo foo (Foo(ac > 1)); 

なぜですか?私はFoo foo (...)だったと思っていますか?

+0

(直交)提案: 'enum class Foo'と' static_cast () 'を使用してください。 – lorro

+0

'Foo foo(Foo(ac> 1))'では、2番目の 'Foo'は実際にキャストされています。 – Jarod42

+1

'Foo(ac> 1)'は '(ac> 1)'から 'Foo'の型キャスト結果です。そして 'Foo foo(Foo(ac> 1));'は、 'Foo'のbyfefaultコピーコンストラクタを呼び出すことを伴います。 – sameerkn

答えて

4

私はあなたがこれを行うことができるとは思わない:

あなたが呼ばれたらどうなるか
enum Foo : bool { Left = false }; 

Foo foo(true); 

をあなた

Foo foo (ac > 1); 

は、あなたのようにFooの列挙型を定義するとあなたが初期化したいものに対して適切なenum値を持っていない。

+0

ほとんどの場合、 'enum'を含むキャスティングには有効な警告がありますが、それは本当に質問に答えていません。 –

関連する問題