2017-07-27 3 views
5

nehme ich diesen Code haben:Ist Drucken eines Mitglieds Zeiger auf einen int definiert

#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; 
} 

Wenn ich betreibe diese mit Microsoft Visual C++ (2015)

bekomme ich folgende Ausgabe

1 
1 

Der Ausgang erwarte ich etwas mehr wie folgt aus:

1 
2 

Das wirft also die Frage auf: Ist das Drucken eines Member-Pointers definiertes Verhalten?

Antwort

12

Es gibt eine definierte Konvertierung von Zeiger zu bool. Da die Zeiger der Mitgliedsvariablen nicht NULL sind, werden sie als wahr ausgewertet und als 1 gedruckt.

+0

Oh .... das macht Sinn (Ich habe gerade gemerkt, dass das wahrscheinlich so war, wie du geantwortet hast) – DarthRubik

7

Das Schlüsselproblem ist, dass ein Zeiger-zu-Element nicht in void* konvertiert werden kann, was die Überladung, die normalerweise Druckzeiger behandelt, dauert.

So wird die nächste beste Umwandlung verwendet, die der Umwandlungszeiger ist ->bool. Beide Zeiger sind keine Nullzeiger, daher erhalten Sie die Ausgabe, die Sie sehen.

Wenn Sie versuchen, "normale" Zeiger (im Gegensatz zu Zeigern zu Element) zu drucken, erhalten Sie die Ausgabe in etwa so wie ursprünglich erwartet.

Verwandte Themen