2017-07-27 2 views
5

Supposons que j'ai ce code:est l'impression d'un pointeur de membre à un int défini

#include <iostream> 

struct Mine 
{ 
    int a; 
    int b; 
}; 


int main() 
{ 

    int Mine::* memberPointerA = &Mine::a; 
    int Mine::* memberPointerB = &Mine::b; 



    std::cout << memberPointerA; 
    std::cout << "\n"; 
    std::cout << memberPointerB; 
} 

Quand je lance cela avec Microsoft Visual C++ (2015)

je reçois la sortie suivante

1 
1 

La sortie est quelque chose que je pense plus comme ceci:

1 
2 

Cela soulève la question suivante: est-ce que l'impression d'un pointeur membre a un comportement défini?

Répondre

12

Il existe une conversion définie du pointeur vers bool. Puisque les pointeurs de variables membres ne sont pas NULL, ils évaluent comme vrai et impriment comme 1.

+0

Oh .... ça a du sens (je viens de réaliser que ça se passait probablement comme tu as répondu) – DarthRubik

7

La question clé est qu'un pointeur-à-membre ne peut pas être converti en void*, ce qui prend en charge la surcharge qui gère généralement les pointeurs d'impression.

Ainsi, la meilleure conversion suivante est utilisée, qui est le pointeur de conversion->bool. Les deux pointeurs ne sont pas des pointeurs NULL, donc vous obtenez la sortie que vous voyez.

Si vous essayez d'imprimer des pointeurs "normaux" (par opposition aux pointeurs vers le membre), vous obtiendrez une sortie conforme aux attentes initiales.