Вложенное пространство имен: доступ к значению из внутреннего пространства имен

0

Я использую вложенное пространство имен в 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

Для приведенного выше фрагмента кода я ожидаю значение x как "50", но я получаю "30". Может кто-нибудь объяснить, что я делаю неправильно здесь?

ОС: окна, инструмент: компилятор кодовых блоков: g++ (mingw)

  • 1
    В этом случае вы должны изменить внутреннюю строку на int x = 30 + Test::x; явно указать сферу.
Теги:
scope
namespaces

2 ответа

0

Ответ равен x=30 потому что вы Test::InTest::x доступ к Test::InTest::x, как указано в вашем using namespace оператора using namespace. Линия

int x = 30 + x;

эквивалентно

int x = 30 + 0;

поскольку значение Test::InTest::x обнуляется после инициализации (спасибо Антону).

Теперь, если вы хотите добавить Test::x в Test::InTest::x, просто скажите это.

int x = 30 + Test::x;

  • 2
    Нет, в этом случае 0 не является случайным, это определяется языковым стандартом.
  • 0
    Спасибо за информацию, я думаю, вы узнаете что-то новое каждый день. Не могли бы вы отослать меня к разделу c ++ std по этому поводу? Я бы очень хотел это проверить.
Показать ещё 2 комментария
0
int x = 30 + x;

x в правой части выражения относится к Test::InTest::x поскольку считается, что он уже объявлен. Таким образом, вы добавляете 30 к собственному значению x, равному 0 при запуске из-за нулевой инициализации статических объектов (это происходит до любой другой инициализации в соответствии с [basic.start.init]/2).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню