2017-02-17 5 views
1
#include <iostream> 

using namespace std; 

struct A 
{ 
    A() 
    { 
     cout << "A::A()" << endl; 
    } 
}; 

int A() 
{ 
    cout << "void A()" << endl; 
    return 0; 
} 

int main() 
{ 
    auto v = A(); 
} 

La sortie est:Pourquoi C++ autorise une fonction et une classe porte le même nom?

vide A()

Pourquoi C++ permet une fonction et une classe ont un même nom?

+4

Le concepteur a pris cette décision et personne ne l'a changé ... je ne sais pas quelle autre réponse vous recherchez. Peut-être que c'était pour la compatibilité avec le code C ou autre code existant –

+0

je demande, pourquoi pas? Juste pour ne pas laisser les gens se confondre? – csmckelvey

+2

Je vote pour clore cette question hors-sujet car elle devrait être adressée à Bjarne Stroustrup. Tout le reste n'est qu'une opinion plus ou moins mal informée. – EJP

Répondre

1

je crois que cela revient à la compatibilité ascendante avec C.

En C, lorsque vous déclarez un struct comme vous l'avez fait, vous avez alors à parler comme struct A, non seulement A. Par exemple:

void A() {} 

struct A {}; 

void f() 
{ 
    A(); 

    struct A x; // works fine 
    A y; // does not compile 
} 

Dans ce contexte, il est logique de permettre A de dire deux choses différentes, car il est toujours clair que l'on vous dire, selon que vous avez utilisé struct ou non.

En C++, struct s (et class es) peuvent être référencés directement, sans avoir besoin d'utiliser le mot-clé struct. Cela introduit l'ambiguïté qui vous préoccupe, mais l'alternative est que le code C valide comme celui ci-dessus ne serait pas un code C++ valide, ce qui est encore pire.

+0

@downvoter Pourriez-vous expliquer ce que vous pensez est faux avec cette réponse? – svick

0

Pourquoi? Parce que c'est la façon dont la langue est ! La fonction A::A() appartient à un "domaine" différent de A().

Il est similaire aux espaces de noms, où le même nom peut exister dans plusieurs domaines. Il est également quelque peu similaire à avoir mille fonctions (ou étendues) différentes ayant toutes leur propre compteur de boucle appelé i.

+0

C'est très différent. L'OP présentait en fait un exemple où la classe 'A' aurait normalement été dans la portée, mais était ombrée par la fonction' A'. Bien sûr, les variables peuvent également être ombragées, mais seulement si elles sont dans des portées différentes. Ici la classe 'A' et la fonction' A' sont globales, donc la même chose ne serait pas permise pour les variables. – sepp2k

+0

@ sepp2k, un chien peut être comme un chat dans un sens (mammalia) et être différent dans un autre (canis/felis). C'est pourquoi j'ai fait attention en utilisant le terme domaine. L'ombrage dans ce cas est seulement du symbole «A», vous pouvez toujours obtenir à tous les deux. Je vais changer le libellé pour, espérons-le, apaiser vos inquiétudes. – paxdiablo