Lo standard dice che comporta una dichiarazione diPerché le funzioni in linea hanno un collegamento esterno per impostazione predefinita?
inline void foo();
che foo
è un inline function with external linkage (perché per impostazione predefinita tutte le dichiarazioni di funzione hanno collegamento esterno). Questo mi sembra strano. poiché la regola della regola una definizione 3.2 (in C++ 03 e C++ 11) dice:
3 ... Una funzione in linea deve essere definita in ogni unità di traduzione in cui viene utilizzata.
5 Ci può essere più di una definizione di una [n] ... funzione inline con collegamento esterno (7.1.2) ... Data una tale entità denominata D definita in più di un'unità di traduzione ... ciascuna definizione di D comprende la stessa sequenza di token
Ciò significa che una funzione inline potrebbe anche avere collegamento interno, perché l'uso della funzione in qualsiasi modo, attraverso un comando esterno (cioè, attraverso unità di traduzione) sarebbe deve invocare un comportamento non definito (dal paragrafo 3) e che il contenuto della funzione inline in tutte le unità di traduzione deve essere lo stesso.
Esiste una retrocompatibilità o un motivo specifico per la catena di strumenti per questa regola?
Credo che [questo] (http://www.glenmccl.com/ansi_015.htm) risponda alla domanda. –
@Als: questo discute le insidie, ma non il motivo per cui tale modifica è stata apportata. –
Se lo leggi completamente, Dice: * "La motivazione immediata di questo cambiamento era la necessità del nuovo modello di compilazione dei template adottato nello stesso incontro, ma più in generale si è ritenuto che cambiare il valore predefinito fosse un'idea il cui tempo era arrivato, e il cambiamento è stato approvato all'unanimità sia in ANSI che in ISO "*. –