优点和缺点内联的朋友助手免费功能在类内部为大型项目定义

时间:2017-07-18 08:23:15

标签: c++

我试图列出在类外定义的助手朋友自由函数和在类中定义的助手朋友自由函数之间的所有差异。

我正在考虑遵循以下规则:将所有帮助函数声明为类体内的朋友,但它没有广泛传播,所以我想知道我是否没有错过一些缺点。

我们假设我们有一个包含数十个范围的类的命名空间,对于这个例子,我们将begin放在类的主体中,end放在类的主体之外(显然,目的不是评论这种不一致)

namespace nm
   {
   struct A
        {
        //...
        auto begin();
        auto end();
        friend auto
        begin(const A& a)
            {
            return a.begin();
            }
        friend auto
        end(const A&);
        };
   inline auto
   end(const A& a)
      {
      return a.end();
      }
   //And tens of other class declaring `begin` and `end`
   }

优点:

  • 如果用户状态begin(x);和x未实现begin,程序编译器将不会列出所有重载的开始,因为只有x实际开始辅助函数才能访问begin。 (开头在命名空间范围内不可见:[classes.friends],N4659中的第7项,在类中定义的友元函数位于定义它的类的(词法)范围内) 。如果用户声明end(x)并且在命名空间nm中声明了x的类型,则编译器将列出所有数十个end声明广告潜在重载。
  • 无法通过用户定义的转换函数访问
  • begin(),这可能是不受欢迎的。

缺点:

  • 如果用户状态begin(x)和x未实现begin,则不会通知用户其他类名称空间的begin实际存在。
  • begin()无法通过用户定义的转换函数访问。

我错过了一些含义吗?如果辅助函数有两个参数呢?如果例如operator==

1 个答案:

答案 0 :(得分:1)

什么“在类中定义的友元函数在定义它的类的(词法)范围内”意味着在A的主体中声明的任何友元函数属于A的命名空间(A的词法范围)。

换句话说:

mpld3.fig_to_html()