Si consideri il seguente:Una conversione enum fuori intervallo produce un valore al di fuori del tipo sottostante?
#include <iostream>
enum class E : bool { A, B };
void foo(E e)
{
switch(e)
{
case E::A: break;
case E::B: break;
default: std::cout << "aha\n";
}
}
int main()
{
foo(static_cast<E>(3));
}
La mia domanda è: il caso default
può essere attivato, vale a dire il programma genera in uscita?
Il punto delicato in N3936 sembra essere specifica di static_cast
quando si converte un numero intero fuori gamma di enumerazione tipo, [expr.static.cast]/10:
Un valore integrale o il tipo di enumerazione può essere convertito esplicitamente in un tipo di enumerazione. Il valore è invariato se il valore originale è compreso nell'intervallo dei valori di enumerazione. In caso contrario, il valore risultante non è specificato (e potrebbe non essere compreso nell'intervallo).
Il testo in grassetto non dice esplicitamente che il valore deve essere ancora compreso nell'intervallo del tipo sottostante, ma mi chiedo se sia stato previsto che lo abbia fatto.
Nota: non intendo limitare la mia domanda a questo esempio specifico - se possibile, una risposta che copra anche le enumerazioni di tipo sottostante non fisso sarebbe ottima –
Questo è UB di [CWG 1766] (http://wg21.link/CWG1766). –
Sì, potrebbe, dato il cast non definito. Almeno VS2013 effettivamente stampa "aha" – Niall