2017-02-17 32 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(); 
} 

Выход:Почему C++ разрешает функцию, а класс имеет одно и то же имя?

аннулировать()

Почему C++ позволяет функции и класс имеют такое же имя?

+4

Дизайнер сделал это решение, и никто не изменил его ... не уверен, какой другой ответ вы ищете. Возможно, это было для совместимости с кодом C или другим существующим кодом –

+0

Я спрашиваю, почему бы и нет? Просто чтобы люди не путали себя? – csmckelvey

+2

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что он должен быть адресован Бьярне Страуструпу. Все остальное - это более или менее неосведомленное мнение. – EJP

ответ

1

Я считаю, что это сводится к обратной совместимости с С.

В C, когда вы объявляете struct, как вы делали, то вы должны обратиться к нему как struct A, а не только A. Например:

void A() {} 

struct A {}; 

void f() 
{ 
    A(); 

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

В этом контексте имеет смысл позволить A означать две разные вещи, потому что всегда ясно, какой из них вы имеете в виду, в зависимости от того, используется ли вы struct или нет.

В C++ struct s (и class es) можно ссылаться напрямую, без использования ключевого слова struct. Это вводит двусмысленность, о которой вы беспокоитесь, но альтернатива заключается в том, что действительный код C, подобный приведенному выше, не будет действительным кодом C++, что еще хуже.

+0

@downvoter Не могли бы вы объяснить, что, по вашему мнению, не так с этим ответом? – svick

0

Почему? Потому что это язык ! Функция A::A() принадлежит к другому "домену", кроме A().

Это похоже на пространства имен, где одно и то же имя может существовать в нескольких доменах.

Это также несколько напоминает тысячу различных функций (или областей), все из которых имеют свой собственный счетчик циклов, который называется i.

+0

Это совсем другое. OP фактически показал пример, где класс 'A' обычно находился в области видимости, но был затенен функцией' A'. Теперь, конечно, переменные также могут быть затенены, но только если они находятся в разных областях. Здесь класс 'A' и функция' A' являются глобальными, поэтому одно и то же не допустимо для переменных. – sepp2k

+0

@ sepp2k, собака может быть как кошка в одном направлении (млекопитающее) и все же быть другим в другом (canis/felis). Вот почему я был осторожен в использовании термина domain. Затенение в этом случае является только символом 'A', вы все равно можете добраться до них обоих. Я изменю формулировку, надеюсь, облегчит ваши проблемы. – paxdiablo