2012-07-25 3 views
2
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num[5]; 
    const int* &ref = num; 

    return 0; 
} 

J'ai lu un livre C++ qui mentionne si une variable de référence fait référence à:Référence au type pointeur

  1. une variable dont le type est différent, mais peut être converti.
  2. une variable qui n'est pas une Lvalue.

Tant que la variable référencement est déclarer comme const, les 2 cas ci-dessus seront résolus en utilisant un procédé dans lequel le compilateur crée un stockage et la valeur sera placée en elle tandis que l'identificateur de la variable référencement est traité comme l'identifiant de cet emplacement de stockage particulier. Voici le code de démonstration.

Case 1
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num = 5; 
    const long long &ref = num; //the value 5 is place in a new storage where ref is the identifier 

    return 0; 
} 
Cas n ° 2:
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num = 5; 
    const int &ref = num + 1; //expression num + 1 evaluated and store in new storage with identifier ref 

    return 0; 
} 

Depuis 2 cas est valable, comment se fait le cas à l'intérieur Le code: est invalide? Ma logique est que puisque le nom du tableau, lorsqu'il est utilisé, sera converti en pointeur vers le premier élément du tableau, le compilateur devrait avoir repéré que ce n'est pas un lvalue et un nouveau stockage sera créé pour stocker ce adresse et, bien sûr, le nom de la variable de référence sera considéré comme l'identifiant de cet emplacement.

Note: Je sais que c'est légèrement hors sujet, mais puis-je savoir si un nom de tableau est Lvalue ou non? Juste un simple oui ou non fera, depuis le changement de code à int &ref = num je suppose que ce n'est pas une valeur, mais j'ai juste besoin d'une confirmation supplémentaire.

Merci.

+1

S'il vous plaît, ** s'il vous plaît ** voir ma modification avant de poster une autre question. Vous devriez apprendre à utiliser l'éditeur de démarques. Il n'est presque jamais nécessaire de revenir à l'utilisation du HTML dans vos messages. En savoir démarquage et s'il vous plaît arrêter l'affichage ** ** brtual html comme ce qui suit:                                           ' – meagar

+1

Et s'il vous plaît cesser d'utiliser "CODE" et "LA QUESTION" en-têtes.Nous pouvons dire quelles parties sont le code, et quelles parties sont la question. Nous comptons sur le balisage et le langage de votre message pour comprendre ce que vous demandez, en jetant des en-têtes gras autour des choses encombrées. – meagar

Répondre

4

La variable de référence est et non déclaré const.

Il y a une différence entre const int * et int * const, et vous avez choisi la mauvaise.

Votre exemple (ii) est invalide pour la même raison, il devrait être const int &ref = num + 1;

Pour votre note, je ne suis pas sûr que oui ou par non. Un nom de tableau simple est une lvalue, faisant référence au tableau. Cependant, dans la plupart des contextes, il se décompose en un pointeur vers le premier élément, qui est un pointeur de valeur.

+0

Désolé pour l'erreur, je viens d'éditer le cas i et le cas je const – caramel1995

+0

Après avoir lu votre réponse, je pense que j'ai trouvé la solution et l'erreur que j'ai faite. const int * et int * const sont en effet différents les uns des autres. – caramel1995

Questions connexes