2010-12-19 2 views
3

Im ayant du mal à comprendre le sens de const int* const &alias_for_ptr = ptr; en ce qui concerne les éléments suivants:Problème avec: 'const int * const & alias_for_ptr = ptr;', pourquoi les deux identifiants ont-ils des valeurs différentes?

#include <iostream> 
using namespace std; 

int main() { 

    int a = 10; 

    int* ptr = &a; 
    const int* const &alias_for_ptr = ptr; 

    ptr = NULL; //or ptr = 0; 

    if (ptr == alias_for_ptr) 
     //This should execute but doesn't 
     cout << "ptr == alias_for_ptr" << endl; 
    else 
     //This should NOT execute but DOES 
     cout << "ptr != alias_for_ptr" << endl; 
    return 0; 

} 

Pourquoi est-ce que ptr == alias_for_ptr renvoie false, (en fait alias_for_ptr conserve sa vieille valeur de &a)? J'avais l'impression que alias_for_ptr aura toujours la même valeur que ptr (bien que l'utilisation du symbole &) et que const int* const X = Y assure seulement que je ne peux pas changer à la fois la valeur de X et la valeur pointée par X par cet identifiant X.

Aussi si je supprime le deuxième const puis le script ne compilera pas, ce qui me confond plus tard. Notez que l'erreur de compilation est: invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’.

Répondre

2

Quel compilateur utilisez-vous? J'ai compilé sous MSVC++ 2010, et cela fonctionne comme prévu.

Je pense que ce qui se passe est un temporaire qui est assigné à une const-référence, puisque le type de "ptr" est converti de "int *" en "const int *". Que se passe-t-il si vous supprimez le premier const?

EDIT: Lisez ici pour plus d'informations sur les références: Reference initialization in C++.

+0

Je pense que c'est votre droit. Im en utilisant g ++, si je supprime le premier const, alors cela fonctionne comme prévu, aussi si j'ajoute un const à la ligne ci-dessus donc son 'const int * ptr = & a;' alors cela fonctionne aussi. Y at-il un moyen de faire sans ajouter/enlever ces deux consts? J'ai essayé d'utiliser l'opérateur 'const_cast' mais sans succès. Prehaps c'est un bug avec g ++. – tmoschou

Questions connexes