In C++, è possibile che i valori del puntatore siano costanti in fase di compilazione. Questo è vero, altrimenti, i parametri del modello non di tipo e constexpr
non funzioneranno con i puntatori. Tuttavia, per quanto ne so, gli indirizzi di funzioni e oggetti di archiviazione statica sono noti (almeno) in fase di collegamento anziché in fase di compilazione. Di seguito è riportato un esempio:Confusione relativa ai valori del puntatore durante la verifica della fase di compilazione
main.cpp
#include <iostream>
template <int* p>
void f() { std::cout << p << '\n'; }
extern int a;
int main() {
f<&a>();
}
a.cpp
Sto solo chiedendo come potrebbe essere conosciuto l'indirizzo del a
durante la compilazione main.cpp
. Spero che qualcuno possa spiegarlo un po 'a me.
In particolare, in considerazione questa dovrebbe l'archiviazione per arr
da assegnare
template <int* p, int* pp>
constexpr std::size_t f() {
return (p + 1) == (pp + 7) ? 5 : 10;
}
int main() {
int arr[f<&a, &b>()] = {};
}
Come?
PLUS: Questo meccanismo sembra essere piuttosto robusto. Anche quando ho abilitato Randomized Base Address, si ottiene l'output corretto.
In g ++, il nome della variabile il cui indirizzo è preso è storpiato in nome della funzione: http://coliru.stacked-crooked.com/a/ee352366c870c010 – dyp
@dyp che ha senso! – Lingxi
@dyp Il linker alla fine aggiusterà il valore dell'indirizzo 'p' nel codice binario dell'istanza del modello. Posso capirlo in questo modo? – Lingxi