Domanda

In C ++ Ho una funzione che richiede solo accesso in sola lettura ad un array ma viene erroneamente dichiarato come riceve un puntatore non-const:

size_t countZeroes( int* array, size_t count )
{
    size_t result = 0;        
    for( size_t i = 0; i < count; i++ ) {
       if( array[i] == 0 ) {
           ++result;
       }
    }
    return result;
}

e ho bisogno di chiamare per un array const:

static const int Array[] = { 10, 20, 0, 2};

countZeroes( const_cast<int*>( Array ), sizeof( Array ) / sizeof( Array[0] ) );

questo sarà undefined comportamento? Se è così - quando verrà il programma eseguito in UB -? Quando si fa il const_cast e chiamando il functon o quando si accede la matrice

È stato utile?

Soluzione

Sì, è consentito (se pericoloso!). E 'la scrittura reale di un oggetto const che incorre in un comportamento indefinito, non il cast in sé (7.1.5.1/4 [dcl.type.cv]).

Come osserva standard in 5.2.11 / 7 [expr.const.cast], a seconda del tipo di oggetto un tentativo di scrivere attraverso un puntatore che è il risultato del casting distanza const può produrre un comportamento indefinito.

Altri suggerimenti

Dal momento che il codice non modifica la matrice, e ti ha detto il compilatore si sa cosa si sta facendo utilizzando il const_cast, si sarà effettivamente OK. Tuttavia, credo che si sta tecnicamente invocando un comportamento indefinito. Meglio per ottenere la dichiarazione di funzione fisso, o scrivere, dichiarare e utilizzare la versione const-safe di esso.

Sì, è possibile farlo. No, non è definito il comportamento fino a quando la funzione di veramente non cerca di scrivere la matrice.

Il problema della const_cast è sempre lo stesso - che ti permette di "rompere le regole", proprio come la fusione da e per void* - che si può fare, ma la domanda è perché si dovrebbe?

In questo caso è ovviamente ok, ma ci si dovrebbe chiedere perché non si dichiara size_t countZeroes( const int* array, size_t count ) in primo luogo?

E come regola generale su const_cast:

  1. Può produrre difficile trovare bug
  2. Stai buttando via il const-accordo con il compilatore
  3. In sostanza si sta trasformando il linguaggio in un livello inferiore.

Utilizzando const_cast su un oggetto che viene inizialmente definita come const è UB, quindi il comportamento indefinito avviene immediatamente al punto di chiamare const_cast.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top