2010-08-25 5 views
8

Sono perfettamente consapevole del fatto che il valore restituito di std::type_info::name() è definito dall'implementazione.Perché type_info :: name() non specificato?

Dalla C++ standard (ISO/IEC 14882: 2003 §18.5.1.7):

Ritorni: un NTB definito dall'implementazione.

La mia domanda è: perché? Questa funzione membro non sarebbe molto più utile se lo standard dettasse quale dovrebbe essere il valore di ritorno?

+0

+1 per questa curiosità. Immagino, la risposta è di dare un po 'di spazio ai compilatori, credo. – Chubsdad

+0

Dato che CAN-NOT non mischia i binari tra i compilatori, fintanto che è coerente nel compilatore, non è un grosso problema. –

risposta

4

In sostanza, se un'implementazione decide che non possono o non vuole sostenere RTTI, si può semplicemente return "";. Se lo standard lo obbliga a restituire qualcosa, probabilmente ucciderebbero qualsiasi possibilità di avere un compilatore conforme per un ambiente in cui le risorse per RTTI non esistono o vogliono essere disabilitate (un microchip, per esempio.)

E non dimentichiamo che non vogliamo forzare uno schema di manipolazione ABI/nome su alcun compilatore.

Questo segue la filosofia C++ "Non paghi per le cose che non ti servono".

+0

+1 per l'argomento RTTI. Ma lo standard non potrebbe dettare qualcosa come * restituire il nome unangled del tipo dinamico se RTTI è supportato e del tipo statico se non *? – Job

+0

@Job: possibile, ma come si formatta il nome del tipo? E dove è memorizzata la stringa? Sono d'accordo che sarebbe bello avere un risultato 'name()' coerente o almeno affidabile, ma non specificato è il meglio che si possa fare, data la natura dei compilatori. (Il modo in cui gestiscono i tipi è il loro business, e non possiamo essere sicuri di come lo gestiscano e quale sia la piattaforma di destinazione, e se questi consentono un significativo risultato 'name()') – GManNickG

+1

Penso che '0' non sia è un NTBS valido, quindi una tale implementazione dovrebbe almeno restituire "". – sbi

2

Quando parliamo di venditori che restituiscono stringhe diverse, penso che sia solo un "lo facciamo in questo modo, si cambia" "no, lo facciamo in questo modo, cambi" la cosa tra i produttori di compilatori. Anche il comitato degli standard non vuole infastidire i team di compilatori, e la creazione di un nuovo standard neutrale che non viene utilizzato da alcun fornitore tende a significare comunque qualcosa di assurdo.

Perché non sono già tutti gli ovvi spazi dei nomi :: classe :: funzioni ecc.? Alcune implementazioni correnti potrebbero aver storicamente trovato conveniente far corrispondere i nomi mutilati richiesti dal linker, essere paranoici (o avere client paranoici) riutilizzare la memoria ecc.