Сокрытие имён в c++

#include <iostream>
  
int x{};

int main()
{

        int x{5};

        {
                int x{7};
                std::cout << x << std::endl;
        }

        return 0;
}

Вот так выведет 7. Если поставлю :: перед x, то выведет 0. Вопрос: как вывести 5?


Ответы (2 шт):

Автор решения: KoVadim

Есть специальный оператор для этого случая - }{

Код будет выглядеть где то так

#include <iostream>
  
int x{};

int main()
{

        int x{5};

        {
                int x{7}; }{
                std::cout << x << std::endl;
        }

        return 0;
}
→ Ссылка
Автор решения: AlexGlebe

Пространства имён созданы, чтобы разделить на несколько частей глобальные переменные и функции. Переменные внутри стека не имеют встроенного механизма доступа. Если например функция рекурсивная и вы хотите узнать значение переменной x, которая должна быть на три вложения выше. Такого механизма просто нет. Всё делается вручную. Или переименовать переменную или делать ссылку на неё.

#include <iostream>

int x{};
int & global_x { x } ;

int main()
{

    int x{5};
    int & main_x { x } ;

    {
            int x{7};
            int & inner_x { x } ;
            std::cout << "x = " << x << " , :: x = " << :: x 
              << " , global_x = " << global_x 
              << " , main_x = " << main_x << " , inner_x = " << inner_x
              << std::endl;
    }

    return 0;
}

=>

x = 7 , :: x = 0 , global_x = 0 , main_x = 5 , inner_x = 7
→ Ссылка