在不同作用域访问具有相同名称的变量

9

使用

#include <iostream>
using namespace std;

        int a = 1;

int main()
{
        int a = 2;

        if(true)
        {
                int a = 3;
                cout << a 
                     << " " << ::a // Can I access a = 2 here?
                     << " " << ::a << endl;
        }
        cout << a << " " << ::a << endl;
}

拥有输出
3 1 1
2 1

有没有办法在等于3的那个'a'的if语句中访问等于2的'a',并输出结果?
3 2 1
2 1

注意:我知道这样做不应该(代码不应该到达需要我问的地步)。这个问题更多的是"能不能做到"。


我不知道是否有相应的语法(我怀疑没有),但请注意,实际上,由于两个变量都在同一个函数中,您将始终控制它们两个,因此您可以自由地重命名其中一个... - BlueRaja - Danny Pflughoeft
很简单。将变量a1,a2和a3重命名即可使其正常工作。即使允许这样做,它也会成为每个编码标准的不良实践部分。为您的每个变量使用唯一的名称。 - Martin York
2个回答

12

不行,一个 (2) 被隐藏了。

参考文献: 3.3.7/1

一个名称可以被在嵌套的声明区域或派生类中用同名显式声明的方式隐藏。

参考文献: 3.4.3/1

类或命名空间成员的名称可以在作用于指定它的类或命名空间的嵌套名指示符上应用作用域解析运算符 (::) 后引用。在 :: 作用域解析运算符之前查找名称时,对象、函数和枚举器名称将被忽略。如果找到的名称不是类名(第9条)或命名空间名(7.3.1),程序就是非法的。


0
简短回答:否。你基本上是覆盖了局部变量继承作用域,它将使用本地副本而不是继承的变量。
这就像子对象覆盖父对象的函数或变量一样,它将使用自己的拷贝,而不管父对象有什么。

这与类级别的作用域不同 - 在那种情况下,有一种语法可以明确地引用其他作用域。 - Keith
是的,但我只是在提到默认行为。 - rayman86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接