Frage

In C ++ ich eine Funktion haben, dass nur Lese erfordert den Zugriff auf ein Array aber fälschlicherweise als Aufnahme eines nicht konstanten Zeiger deklariert:

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;
}

und ich brauche es für einen const-Array nennen:

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

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

wird dieses Verhalten nicht definiert werden? Wenn ja - wann wird der Programmablauf in UB - wenn dabei die const_cast und den Aufruf der functon oder beim Zugriff auf das Array

War es hilfreich?

Lösung

Ja, es ist erlaubt (wenn gefährlich!). Es ist das eigentliche Schreiben in ein const Objekt, das Verhalten undefiniert erleidet und nicht die Besetzung selbst (7.1.5.1/4 [dcl.type.cv]).

als Standard Notes in 5.2.11 / 7 [expr.const.cast], abhängig von der Art des Objekts eines Versuch, zu schreiben, durch einen Zeiger, der das Ergebnis des Gießens entfernt const ist möglicherweise undefiniertes Verhalten erzeugen.

Andere Tipps

Da Ihr Code nicht mit dem Array ändern, und Sie sagte dem Compiler Sie wissen, was Sie mit dem const_cast tun, werden Sie tatsächlich in Ordnung sein. Aber ich glaube, Sie technisch nicht definiertes Verhalten sind aufgerufen wird. Beste die Funktionsdeklaration fest oder Schreib, declare und verwenden Sie die const sichere Version erhalten.

Ja, können Sie das tun. Nein, es ist nicht nicht definiertes Verhalten, solange die Funktion wirklich nicht auf das Array zu schreiben, nicht versuchen.

Das Problem der const_cast ist immer das gleiche - es ermöglicht es Ihnen, „die Regeln zu brechen“, so wie zum Gießen und von void* - sicher, dass Sie das tun können, aber die Frage ist, warum sollen Sie?

In diesem Fall ist es natürlich ok, aber man sollte sich fragen, warum Sie nicht size_t countZeroes( const int* array, size_t count ) in erster Linie erklären?

Und in der Regel über const_cast:

  1. Es kann schwierig produzieren Fehler finden
  2. Sie werfen die const-Vereinbarung mit dem Compiler entfernt
  3. Im Grunde sind Sie die Sprache in eine untere Ebene ein Drehen.

Mit const_cast auf ein Objekt, das zunächst als const definiert ist, UB, damit das nicht definiertes Verhalten kommt sofort an der Stelle Sie const_cast nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top