【问题标题】:Nested Namespace: accessing value from the inside namespace嵌套命名空间:从内部命名空间访问值
【发布时间】:2015-01-08 02:30:31
【问题描述】:

我在 C++ 中使用嵌套命名空间并尝试访问内部命名空间内的外部命名空间的值,但它不起作用?谁能解释一下原因?

代码:

#include <iostream>
using namespace std;

namespace Test
{
    int x = 20;
    namespace InTest
    {
        int x = 30 + x;
    }
}

int main()
{
    using namespace Test::InTest;
    cout << "X = " << x << endl;
    return 0;
}

输出:

X = 30

对于上面的代码 sn-p,我期望 x 的值为 '50',但我得到的是 '30'。有人可以解释一下我在这里做错了什么吗?

操作系统:windows, 工具:代码块 编译器:g++ (mingw)

【问题讨论】:

  • 在这种情况下,您应该将内行更改为int x = 30 + Test::x; 以明确指定范围。

标签: c++ namespaces scope


【解决方案1】:

答案是x=30,因为您正在访问Test::InTest::x,正如您的using namespace 语句所述。线

int x = 30 + x;

等价于

int x = 30 + 0;

因为Test::InTest::x 的值在初始化时归零(感谢 Anton)。

现在,如果你想将Test::x添加到Test::InTest::x,就这么说吧。

int x = 30 + Test::x;

【讨论】:

  • 不,在这种情况下0 不是随机的,它是由语言标准指定的。
  • 感谢您的信息,我想您每天都会学到一些新东西。你能把我推荐给关于这个的 c++ std 部分吗?我真的很想看看。
  • [basic.start.init]/2: 在进行任何其他初始化之前,具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应进行零初始化 (8.5)。
【解决方案2】:
int x = 30 + x;

表达式右侧的x 指的是Test::InTest::x,因为它被认为已经声明。因此,您将 30 添加到 x 自己的值,这在启动时等于 0,因为静态对象的零初始化(它发生在根据 [basic.start.init]/2 进行的任何其他初始化之前)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2012-08-06
    相关资源
    最近更新 更多