2010-02-18 2 views
2

1) Quelqu'un peut-il expliquer ce qui suit?2 questions rapides sur le passage de const pointeur/const référence

void OnCreate(HWND hWnd, const LPCREATESTRUCT lpCreateStruct) 
{ 
    lpCreateStruct->x = 2; // this compiles 
} 

void OnCreate(HWND hWnd, const CREATESTRUCT * lpCreateStruct) 
{ 
    lpCreateStruct->x = 2; // this does not compile 
} 

2) Est-il plus rapide de passer par un pointeur ou par référence? Ou la même chose?

+0

Je pourrais compiler parce que je spécifie const, et j'essaie de le changer dans la fonction – Craig

+1

gcc me donne une erreur pour votre fonction const my_structure * ... quel compilateur utilisez-vous? Des paramètres spéciaux? –

+0

Le code que j'ai posté n'a pas actaully compiler (ce qui était ce que je voulais). Ici, j'ai édité mon premier post avec le code qui est réellement dans mon programme. Des idées? – Marlon

Répondre

2

Pourquoi les éléments suivants affectent-ils 2 à x lorsqu'il s'agit de const?

Il ne doit pas, tout compilateur conforme à la norme fait qu'une erreur, car ms des points à un const my_structure.

modifier:

Avec votre cas mis à jour, est un problème de typedefs travail:

typedef T* TPtr; 

void f(const TPtr); 
void g(T* const); 
void h(const T*); 

Les deux f() et g() sont équivalents et prendre un pointeur const à un T, tout en h() un pointeur vers un const T.

+0

oui, je me suis testé. le code que j'ai posté ne compilait pas, donc j'ai édité avec mon propre code – Marlon

5

const LPCREATESTRUCT se dilate à CREATESTRUCT* const, à savoir un pointeur constant à structure non-const, tandis que const CREATESTRUCT* est un pointeur non constant à périmètre constant, de sorte que le compilateur est exact.