未在命名空间中声明和定义的命名空间类的朋友

问题描述

这样做正确吗?

void f();

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

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

代码已在VS中成功编译。但是我找不到有关在标准中为朋友声明限定名称间的任何信息。合法吗?有人可以提供标准的链接或报价吗?

解决方法

是的,合法的。

namespace仅仅是为函数,类等添加另一层描述的方法。

即使friend与该函数位于不同的class中,也可以在class内将任何函数标记为namespace。该函数也可以位于namespace中。

标准中没有关于此的特定部分,但这是标准的必然结果。此参考是一个起点:https://en.cppreference.com/w/cpp/language/namespace