Mentre il nome di una struttura deve essere univoco nell'insieme di strutture all'interno di un namespace, tale nome può essere "condiviso" con variabili e funzioni. Ad esempio, il seguente codice viene compilato bene:univocità dei nomi di struttura
// Code 1
struct h{};
int h{ 8 };
Allo stesso modo, non v'è alcuna collisione in:
// Code 2
struct h{};
void h(){}
1) Qual è stato il ragionamento di permettere che la condivisione nome?
Inoltre, se inseriamo modelli nel mix, abbiamo alcune situazioni strane. Il codice
// Code 3
template< class H > void h(){}
struct h{};
template< class H > struct j{};
void j(){}
compilare; ma il seguente codice non riesce:
// Code 4
struct h{};
template< class H > void h(){}
void j(){}
template< class H > struct j{};
2) Perché il ragionamento che ha permesso il codice 2 non era abbastanza buono per permettere codice a 4? Non sto chiedendo le regole nello standard. Sto chiedendo il motivo dietro a quelle regole.
1) Compatibilità con C, dove dovresti usare 'struct h' per fare riferimento alla struct. Le intestazioni Unix ('stat.h') lo usano, quindi dovevano essere supportate anche in C++ e non potevano essere rimosse (fonte: D & E 2.8.2). – dyp
Che cos'è D & E 2.8.2? – Hector
["The Design and Evolution of C++"] (http://stroustrup.com/dne.html), di Bjarne Stroustrup. – dyp