2016-06-29 24 views
5

Se mi definiscono un enum in questo modo:costruendo enum con sottostante il tipo "bool" di un booleano?

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

poi cercare di costruire uno da un valore booleano in questo modo:

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

fallisce, ma lavora con un costruttore in più in questo modo:

Foo foo (Foo(ac > 1)); 

Perché è questo? Ho pensato che Foo foo (...)era una chiamata al costruttore esplicita?

+0

(ortogonale) Suggerimento: utilizzare 'enum class Foo' e' static_cast () '. – lorro

+0

In 'Foo foo (Foo (ac> 1))', il secondo 'Foo' è in effetti un cast. – Jarod42

+1

Suppongo che 'Foo (ac> 1)' sia il risultato di typecasting di '(ac> 1)' a 'Foo'. E 'Foo foo (Foo (ac> 1));' implica chiamare il costruttore di copia di default di 'Foo'. – sameerkn

risposta

4

Non credo che si può fare questo:

Foo foo (ac > 1); 

Supponiamo che si definiscono Foo enum come:

enum Foo : bool { Left = false }; 

che cosa accadrebbe se si chiama:

Foo foo(true); 

È non avere il valore enum appropriato per ciò che si desidera inizializzare con.

+0

In realtà non risponde alla domanda * di per sé *, anche se nella maggior parte dei casi è un avvertimento valido per il casting che riguarda enum's. –

Problemi correlati