Я использую вложенное пространство имен в 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)
Ответ равен 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;
0
не является случайным, это определяется языковым стандартом.
int x = 30 + x;
x
в правой части выражения относится к Test::InTest::x
поскольку считается, что он уже объявлен. Таким образом, вы добавляете 30 к собственному значению x
, равному 0
при запуске из-за нулевой инициализации статических объектов (это происходит до любой другой инициализации в соответствии с [basic.start.init]/2
).
int x = 30 + Test::x;
явно указать сферу.