2009-04-03 14 views
6

mi sono imbattuto in un codice che si riduce al seguente:Perché dovresti scegliere gli obiettivi di un incarico?

enum BAR { /* enum values omitted */ } 

class Foo{ 
public: 
    void set(const BAR& bar); 
private: 
    uint32_t bits; 
}; 

void Foo::set(const BAR& bar) 
{ 
(uint32_t&)bits = bits | bar; 
} 

non capisco il punto del cast c-style nell'assegnazione di Foo :: set. Perché dovresti scegliere gli obiettivi di un incarico? Sono pazzo, o questo ha uno scopo?

+0

per evitare avvisi del compilatore sulla perdita di precisione, forse? Non sono così sicuro però. –

risposta

8

In questo caso, non riesco a vedere alcun motivo per il cast, in quanto il cast in questione è dello stesso tipo del cast. In generale, potrebbe essere utilizzato per forzare l'utilizzo di un determinato operatore di assegnazione.

Ora ripeterò il mio mantra: se il tuo codice contiene cast, probabilmente c'è qualcosa di sbagliato nel codice o nel design e dovresti esaminare entrambi allo scopo di rimuovere il cast.

+0

Sì. L'ultima volta che ne ho usato uno, stavo usando l'API Win32. C'era qualcosa di sbagliato nel codice, e non ero io. Probabilmente una di quelle cose che sembravano un'idea migliore quindici anni fa. –

+0

+1 per un bel mantra. – bayda

-1

Se si desidera consentire solo un determinato valore (ad es., Il controllo sull'assegnazione viene eseguito come se fosse una variabile digitata come nel cast, invece di lasciare passare tutto come se si fosse allargato il rhs).

0

Non fa nulla, per quanto posso dire, anche se BAR è definito con valori al di fuori dell'intervallo uint32. Sembra un rumore per me.

2

Sono d'accordo con Neil Butterworth, il cast in questo caso non è necessario ed è un "odore di codice" definito.

0

Non posso dirlo con certezza senza conoscere lo sfondo, ma sembra che qualcuno abbia preso del codice C esistente e lo abbia avvolto in una classe C++. Il cast potrebbe essere un residuo del codice c.

0

Non sono sicuro che sia legale. un cast non è un lvalue ...

In entrambi i casi, sembra abbastanza inutile.

Problemi correlati