为什么我的C++代码甚至用双重声明的变量编译?
我想从书中学习C++ Accelerated C++。在第一章结尾处有一个让我感到沮丧的练习。从本质上讲,我很奇怪,为什么下面的代码编译和运行完美:为什么我的C++代码甚至用双重声明的变量编译?
#include <iostream>
#include <string>
int main() {
{
const std::string s = "a string";
std::cout << s << std::endl;
{
std::cout << s << std::endl;
const std::string s = "another string";
std::cout << s << std::endl;
};
}
return 0;
}
在我看来,我倍加声明字符串s,从我的理解,这是非法的。你能帮助我更好地理解这一点吗?谢谢。生成的输出是:
a string
a string
another string
在C++中,您可以重新声明嵌套作用域中的变量。在此范围内,重新声明的变量优先。
见[basic.scope.hiding]用于标准参考:
的名称可以由相同的名称的显式声明在嵌套声明区域被隐藏或派生 类
谢谢。我的理解是,内部范围包含在外部范围内,因此就第一个's'而言,它被宣布了两次。所以我认为我对示波器的理解有些偏离。这个概念并不像我想象的那样“线性”。 – teachMeCpp
@teachMeCpp:的确如此。不过,这至少是合乎逻辑的。与PHP不同的是,在外层作用域中看起来像一个内层作用域的变量声明可见(范围的定义很奇怪) – AndyG
我向下面的Filip问了下面的问题:我有点看出它是合乎逻辑的,但我没有设想这个功能在什么情况下会有用。你能评论这个吗? – teachMeCpp
这些是两个独立的变量,因为它们在不同的范围内声明。变量的范围是可见的代码的“区域”。
外部s
在内部被s
覆盖。
谢谢。正如我在对AndyG的评论中指出的那样,我认为我对范围的理解是关闭的。我发现外面的'''被覆盖在内部身体中,但只要代码退出内部身体,外部's'被恢复。我想知道,这个功能有什么用处?对于像我这样的新手来说,它似乎绝对不是万无一失的。 – teachMeCpp
是的,因为在体内的''''超出了范围,所以只有外面的''':-) –
哦,对,我同意,其他的''一定要恢复。我想知道在嵌套范围内允许重新声明的这个特性是否有用。这不会造成问题吗? – teachMeCpp
强相关/可能重复:https://*.com/questions/4151203/why-is-this-c-working-variables-with-the-same-name –