2011-09-20 2 views
5

Esiste un modo per evitare il codice binario risultante dal codice this question? Idealmente tramite un errore in fase di compilazione. il codice di esempio dalla domanda:C'è un modo di causare un errore di compilazione se si prova ad assegnare un numero negativo a un contenitore non firmato?

unsigned int nVal = 0; 
nVal = -5; // no error! 
+0

'errore del compilatore' in fase di esecuzione? * L'assegnazione * avviene in fase di esecuzione. – Nawaz

+1

Ci potrebbe essere un modo sfruttando le regole di conversione convolute, ma significherebbe cambiare il codice in modo che non usi 'unsigned int', ma qualcosa come' EnforcedUnsignedInt' con altre classi intermedie per causare la generazione di codice diverso quando si utilizza l'operatore ' = 'con firmato/non firmato. Verdetto: non pratico/realistico. – tenfour

+1

L'assegnazione iniziale di '0' (che è firmata), piuttosto che' 0u', presumibilmente genererebbe anche l'avviso/errore che si desidera. –

risposta

10

Se si utilizza g ++, l'interruttore -Wsign-conversion avviserà la conversione, e -Werror farà che avverte un errore.

+0

Perfetto, proprio quello che stavo cercando! –

+0

In Visual Studio, è anche possibile attivare una funzionalità "Tratti avvisi come errori" nelle opzioni di creazione di un progetto. E il compilatore dovrebbe sollevare un avviso per la possibile perdita di dati durante la conversione da int a unsigned int. – Seb

4

Modifica: Oltre alla risposta di @ thiton.

Con il semplice compito non è possibile. Tuttavia, se si assegna il valore in modo speciale spostato, allora può essere d'aiuto. vale a dire

nVal = -5; 

dovrebbe essere sostituito con,

Assign<-5>(nVal); 

Dove, Assign() sembra,

template<int VAL> 
void Assign (unsigned int &nVal) 
{ 
    typedef int arr[(VAL >= 0) 1 : -1]; 
    nVal = VAL; 
} 

Demo.