Quindi stavo leggendo la sezione 3.2 (Una sezione delle regole di definizione) nel ultima bozza di lavoro dello standard C ++ e ci siamo imbattuti in questo:
Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required.
Questo mi è sembrato strano per quanto riguarda la parte variable , perché se un file di intestazione ha una variabile costante globale e funziona in questo modo:
const int k = 10;
int foo(const int &i) {
return 0;
}
Che cosa succede se per errore chiami foo(k)
? Sembra che questo risulterebbe in UB perché k
ha linkage interno (cioè ogni unità di traduzione avrebbe la propria definizione di k
, quindi non ci sarebbe esattamente una definizione ... in quel programma ). Quindi, in pratica, se hai una qualsiasi variabile const
con ambito globale, dovresti ricordare di non chiamare nessuna funzione che prende il suo riferimento o indirizzo.