为何不能将函数与初始化变量命名为同一名称?
为何不能将函数与初始化变量命名为同一名称?
咱们先看你写的这段出问题的代码:
#include <iostream> double towerHeight() { std::cout << "Insert the height of the tower"; double towerHeight{}; std::cin >> towerHeight; return towerHeight; } int main() { double towerHeight {towerHeight()}; // 此处报错 }
这个问题其实是C++的名称查找规则在起作用,我给你掰扯明白:
- 当编译器处理
main里的double towerHeight {towerHeight()};时,会先在当前作用域(也就是main函数内部)找名为towerHeight的标识符。 - 在C++的规则里,变量的名称从它的声明点开始就已经在当前作用域可见了——哪怕是在初始化它的那行代码里。所以此时编译器会把右边的
towerHeight当成你正在声明的这个double类型变量,而不是外面那个同名的函数。 - 但
double类型的变量根本不能像函数那样加括号调用,这就违反了语法规则,自然会抛出错误。
你把函数名改成owerHeight或者其他不同的名字后,main里的变量名和外部函数名不冲突,编译器就能正常找到外部的函数来调用,代码也就正常运行了。
简单说就是:同一个作用域里,后出现的同名标识符会“盖住”之前的,而且变量声明的可见性早到初始化阶段,直接抢了函数名的“戏份”,导致编译器认不出你要调用的是函数。
备注:内容来源于stack exchange,提问作者J.R.
相关产品推荐
相关产品推荐

