#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 обсуждаются функции-члены другого класса, которые должны использовать определенные идентификаторы, и существует ряд правил «если не указано иное».