Вложенное анонимное пространство имен - PullRequest
1 голос
/ 10 июля 2020

Следующие строки эквивалентны (начиная с c ++ 17):

namespace A { namespace B {} }
namespace A::B {}

Есть ли квалифицированный эквивалент для строки ниже?

namespace A { namespace {} }

Спасибо

1 Ответ

0 голосов
/ 10 июля 2020

Члены анонимного пространства имен (также называемого безымянным пространством имен) занимают глобальную область видимости и доступны во всех областях, следующих за объявлением в файле. Мы можем получить к ним доступ без какой-либо квалификации.

Если вы рассматриваете следующую программу:

#include <iostream>

// named namespace
namespace A {
    // unnamed namespace
    namespace {
        int a;
    }
}

int main(void) {
    // initializing an unnamed namespace member
    // you need to use `::` because that unnamed namespace
    // is containing in a named namespace `A`
    A::a = 10;

    // calling the unnamed namespace member
    std::cout << A::a << std::endl;

    return 0;
}

Вам необходимо использовать квалификатор ::, т.е. A::a, если вы определяете безымянное пространство имен, вам больше не потребуется использовать квалификацию, указанную в примере:

// unnamed namespace
namespace {
    int a;
}

int main(void) {
    // simply accessed
    a = 10;
}
...