2015-08-27 14 views
5

SSCCE:cast di tipo non è riuscito a passare per enum con memoria limitato

enum class confirm {yes}; 

struct item 
{ 
    confirm s:4; // (1) limiting storage size required 
}; 

int main() 
{ 
    item itm; 

    itm.s = confirm::yes; // (2) OK 

    switch (itm.s) 
    { 
    case confirm::yes: // (3) Failure, need static data cast here? 
     break; 
    } 
} 

produce errore:

In function ‘int main()’: 
error: could not convert ‘yes’ from ‘confirm’ to ‘int’ 
case confirm::yes: 
      ^

durante la compilazione con g ++ ma compilato bene da clang ++. Perché l'assegnazione contrassegnata da (2) possibile ma causa clausola contrassegnata da (3) no?

Avvertimento in too small storage è di offtopic

+0

"Questo è un bug di gcc" può essere una risposta sufficiente? (naturalmente con la prova che dovrebbe essere consentito) – Yakk

+0

@Yakk: c'è dubbio – dyomas

+0

@dyp: grazie per il tagging, ma una domanda è specifica solo per 'enum class' -C++ 11; nessun problema di questo tipo negli standard precedenti – dyomas

risposta

2

Questo appare come un insetto gcc, possiamo vedere questo funziona in the latest gcc version:

Dal progetto C++ 11 sezione standard 6.4.2[stmt.switch]:

The condition shall be of integral type, enumeration type, or of a class type for which a single non-explicit conversion function to integral or enumeration type exists (12.3). [...] Integral promotions are performed. Any statement within the switch statement can be labeled with one or more case labels as follows:

case constant-expression : 

where the constant-expression shall be a converted constant expression (5.19) of the promoted type of the switch condition.

convertito espressione costante è illustrato nella sezione 5.19 che dice:

[...]A converted constant expression of type T is a literal constant expression, implicitly converted to type T, where the implicit conversion (if any) is permitted in a literal constant expression and the implicit conversion sequence contains only user-defined conversions, lvalue-to-rvalue conversions (4.1), integral promotions (4.5), and integral conversions (4.7) other than narrowing conversions (8.5.4). [ Note: such expressions may be used as case expressions (6.4.2), as enumerator initializers if the underlying type is fixed (7.2), and as integral or enumeration non-type template arguments (14.3). —end note ] [...]

Forse questo è relativo a defect report 1767: Scoped enumeration in a switch statement. Quindi forse stava forzando una promozione su int e quindi il confronto nel caso sarebbe fallito.

Problemi correlati