Ho il codice seguente:Perché il valore di un puntatore-membro è sempre lo stesso per i diversi membri della stessa struttura?
#include <iostream>
#include <string>
using namespace std;
struct foo_s {
string a;
string b;
string c;
};
void print_field(foo_s* foo, string foo_s::* field) {
cout << "field: " << field << " - " << foo->*field << endl;
}
int main() {
foo_s my_foo = {
"a",
"b",
"c",
};
print_field(&my_foo, &foo_s::a);
print_field(&my_foo, &foo_s::b);
print_field(&my_foo, &foo_s::c);
return 0;
}
La sua uscita è:
field: 1 - a
field: 1 - b
field: 1 - c
Sto avendo un po 'di difficoltà a capire le specifiche di quello che sta succedendo nella funzione print_field()
. Vale a dire:
- Qual è il tipo di
field
? Immagino siapointer-to-string-foo_s-member
- Perché il valore di
field
è sempre lo stesso (1 in questo caso), tuttaviafoo->*field
produce risultati diversi?
Principalmente, sono sconcertato in # 2. Ho immaginato campo sarebbe stato un "offset" dall'inizio della struct e foo->*field
sarebbe stato concettualmente equivalente a qualcosa come
char* ptr = static_cast<char*>(foo);
ptrdiff_t offset = somehow_get_the_byte_offset_from_pointer_to_member(field);
ptr = ptr[offset];
string result = *static_cast<string*>(ptr);
ma che sembra essere fuori dal field
s' valore non varia tra le chiamate. Cosa mi manca? In che modo esattamente questa operazione specifica è descritta dallo standard?
Wow, questo mi insegna a stare con la buona vecchia stampa, e se è solo perché la capisco meglio. – martin
@martin: questo darà un comportamento indefinito se si tenta di stampare un puntatore membro. C++ I/O è almeno tipologico, se a volte confuso. –
@martin Domanda divertente - quale specificatore di formato si intende utilizzare per il puntatore al membro? Non conosci nemmeno le dimensioni della cosa (generalmente). – Angew