【发布时间】:2016-01-19 21:17:15
【问题描述】:
今天遇到了一个有趣的问题,并试图了解原因。
考虑以下几点:
class Base
{
public:
Base(){}
~Base(){}
static void function1(){}
void function2()
{
int function1;
function1 = 0;
function1(); //<-compiler error
function1 = 1;
}
};
我收到以下错误:
明显调用括号前的表达式必须具有(指向)函数类型
我想我明白为什么会出现此错误:
当
function1在function2()之外被自己调用时,实际上是一个指向function1()的函数指针。在
function2的范围内,当int function1被声明时,'function1变量'阴影'function1函数指针'。当在
function2()内部调用function1()时,它假定function1是变量并给出错误。通过在
function2()中调用Base::function1();来解决此问题。
我的问题是:为什么编译器在声明int function1; 时不报错?这不应该被允许吗?
【问题讨论】:
-
你几乎是正确的,除了没有函数 pointers 涉及,只有函数。名称阴影是允许的,这就是它不是错误的原因。
-
-Wshadow,或者任何你的编译器调用它。 -
您可以随时在新范围内声明任何名称,如果该名称已存在于外部范围内,它将隐藏相同的名称
-
为什么你认为function1必须是一个指针? function1 是一个标识符,如果你在
function2中使用它,它会解析为int类型的变量,你不能调用int类型的变量。 -
编译器具有使该代码示例正确编译所需的信息。但是,如果变量
function1是函子或 lambda,那将是模棱两可的。根据您使用function1的方式,它会变得非常混乱并且有相当多的模棱两可的用例,因此使用更简单的名称查找规则来禁止这种情况而不是试图弄清楚您的意图会更容易/更好。
标签: c++ scope declaration name-lookup name-hiding