Друг класса пространства имен, который не объявлен и не определен в пространстве имен

#c #function #namespaces #friend

#c #функция #пространства имен #друг

Вопрос:

Правильно ли это делать:

 void f();

namespace ns
{
    class C
    {
        int m;
        friend void ::f();
    };
}

void f()
{
    ns::C c;
    c.m = 2;
}
  

?

Код успешно скомпилирован в VS. Но я ничего не могу найти о том, как указать пространство имен для объявления друга в стандарте. Это вообще законно? Может ли кто-нибудь предоставить ссылку или цитату из стандарта?

Ответ №1:

Да, это законно.

namespace — это немного больше, чем способ добавления другого уровня разграничения функций, классов и c..

Любая функция может быть помечена как a friend внутри a class , даже если она class находится в другом namespace качестве, чем функция. Функция также может быть в namespace .

В стандарте нет специального раздела по этому вопросу, но это следствие стандарта. Эта ссылка является отправной точкой: https://en.cppreference.com/w/cpp/language/namespace

Комментарии:

1. Кроме того, [class.friend] подразумевает это более строго, чем просто не запрещая это: в параграфе 5 обсуждаются функции-члены другого класса, которые должны использовать определенные идентификаторы, и существует ряд правил «если не указано иное».