为什么我的C++代码甚至用双重声明的变量编译?

为什么我的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 
+0

强相关/可能重复:https://*.com/questions/4151203/why-is-this-c-working-variables-with-the-same-name –

在C++中,您可以重新声明嵌套作用域中的变量。在此范围内,重新声明的变量优先。

见[basic.scope.hiding]用于标准参考:

的名称可以由相同的名称的显式声明在嵌套声明区域被隐藏或派生 类

+0

谢谢。我的理解是,内部范围包含在外部范围内,因此就第一个's'而言,它被宣布了两次。所以我认为我对示波器的理解有些偏离。这个概念并不像我想象的那样“线性”。 – teachMeCpp

+0

@teachMeCpp:的确如此。不过,这至少是合乎逻辑的。与PHP不同的是,在外层作用域中看起来像一个内层作用域的变量声明可见(范围的定义很奇怪) – AndyG

+0

我向下面的Filip问了下面的问题:我有点看出它是合乎逻辑的,但我没有设想这个功能在什么情况下会有用。你能评论这个吗? – teachMeCpp

这些是两个独立的变量,因为它们在不同的范围内声明。变量的范围是可见的代码的“区域”。

外部s在内部被s覆盖。

+0

谢谢。正如我在对AndyG的评论中指出的那样,我认为我对范围的理解是关闭的。我发现外面的'''被覆盖在内部身体中,但只要代码退出内部身体,外部's'被恢复。我想知道,这个功能有什么用处?对于像我这样的新手来说,它似乎绝对不是万无一失的。 – teachMeCpp

+0

是的,因为在体内的''''超出了范围,所以只有外面的''':-) –

+0

哦,对,我同意,其他的''一定要恢复。我想知道在嵌套范围内允许重新声明的这个特性是否有用。这不会造成问题吗? – teachMeCpp