Sun Studio 12 Update 1:C++ 用户指南

4.9 将静态名称空间作用域函数声明为类友元

下面的代码是无效的:


class A {
  friend static void foo(<args>);
  ...
};

因为类名具有外部链接并且所有定义必须是相等的,所以友元函数也必须具有外部链接。但是,如果使用 -features=extensions 选项,编译器将接受该代码。

程序员处理该无效代码的方法大概是在类 A 的实现文件中提供非成员 "helper" 函数。可以通过使 foo 成为静态成员函数得到相同效果。如果不要客户端调用函数,则可以使该函数私有化。


注 –

如果使用该扩展,则任何客户端都可以“劫取”您的类。任何客户端都可以包括类的头文件,然后定义其自身的静态函数 foo,该函数将自动成为类的友元。结果就好像是您使类的所有成员成为了公共的。