函数,类和变量都具有相同的名称

Alo*_*lok 1 c++ name-lookup

为什么有些这些编译而有些不能编译?

场景1:编译错误 'main' : redefinition; previous definition was 'data variable'

#include <iostream>
using namespace std;
int main;
int main(){ }
Run Code Online (Sandbox Code Playgroud)

场景2:编译错误 syntax error : missing ';' before identifier 'obj

#include <iostream>
using namespace std;
class main { };
int main(){ 
   main obj;
} 
Run Code Online (Sandbox Code Playgroud)

情景3:工作正常

#include <iostream>
using namespace std;
class main { };
int main(){ 
   class main obj;
} 
Run Code Online (Sandbox Code Playgroud)

情景4:工作正常

#include <iostream>
using namespace std;
class main {};
main obj;
int main(){ }
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 8

名称查找工作中的条款名称.查找名称,与名称指定的名称无关.

在同一范围内,不允许将同一名称声明为函数和变量.

但是,class X即使X是函数名称或变量,也允许存在.如果有class X,则将当前范围X作为名称(指定该类).如果同一范围X声明为typename和variable name,则只需查找即可x查找变量名称.

如果新作用域声明,X那么X该作用域中的任何使用都会找到在其作用域中声明的名称,这称为阴影.(名称查找搜索当前范围,然后搜索包含该范围的范围,依此类推到全局范围).

  1. 错误,尝试声明main为函数和变量

  2. 要处理main obj;,请main查找名称.首先检查当前作用域,找到函数名称main; 所以它不会检查全局范围.我们说内部范围的名称会影响外部范围的名称.所以,这是你得到的同样的错误void foo(); foo obj;

  3. class main毫不含糊地说要查找班级名称main; 但是没有发现int main()它会回到检查全局范围.

  4. 什么都不新,main obj;没什么区别.

另一个有趣的例子是:

int x;
class x { };

int main()
{
    x = 1;        // ok
    x y;          // error, `x` means the int
    class x y;    // ok
}
Run Code Online (Sandbox Code Playgroud)