Question

En C ++ j'ai une fonction qui ne nécessite que l'accès en lecture seule à un tableau, mais est à tort comme la réception d'un pointeur 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;
}

et je dois l'appeler pour un tableau const:

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

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

cela sera un comportement non défini? Dans ce cas - quand le programme exécuté en UB - lorsque vous faites la const_cast et appeler le functon ou lors de l'accès réseau

Était-ce utile?

La solution

Oui, il est permis (si dangereux!). Il est l'écriture réelle à un objet const qui engage un comportement non défini, non le casting lui-même (7.1.5.1/4 [dcl.type.cv]).

Comme l'indique standard dans 05.02.11 / 7 [expr.const.cast], en fonction du type de l'objet d'une tentative d'écriture par un pointeur qui est le résultat de la coulée à une distance const peut produire un comportement non défini.

Autres conseils

Étant donné que votre code ne modifie pas le tableau, et vous avez dit au compilateur que vous savez ce que vous faites en utilisant le const_cast, vous allez réellement être OK. Cependant, je crois que vous êtes techniquement invoquez un comportement non défini. Meilleur pour obtenir la déclaration de fonction fixe ou écrire, Accroche et utiliser la version const-sûre de celui-ci.

Oui, vous pouvez le faire. Non, ce comportement est pas indéfini tant que la fonction ne truely tentez pas d'écrire au tableau.

Le problème de const_cast est toujours le même - il vous permet de « briser les règles », tout comme la coulée vers et à partir void* - que vous pouvez le faire, mais la question est pourquoi devriez-vous?

Dans ce cas, il est bien sûr ok, mais vous devez vous demander pourquoi ne pas vous déclarez size_t countZeroes( const int* array, size_t count ) en premier lieu?

Et en règle générale sur const_cast:

  1. Il peut produire difficile de trouver des bugs
  2. Vous jeter la const-accord avec le compilateur
  3. Fondamentalement, vous tournez la langue dans un niveau inférieur.

Utilisation const_cast sur un objet qui est initialement définie comme const est UB donc le comportement non défini se réalise immédiatement au point que vous appelez const_cast.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top