我试图列出在类外定义的助手朋友自由函数和在类中定义的助手朋友自由函数之间的所有差异。
我正在考虑遵循以下规则:将所有帮助函数声明为类体内的朋友,但它没有广泛传播,所以我想知道我是否没有错过一些缺点。
我们假设我们有一个包含数十个范围的类的命名空间,对于这个例子,我们将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(x)
和x未实现begin
,则不会通知用户其他类名称空间的begin
实际存在。我错过了一些含义吗?如果辅助函数有两个参数呢?如果例如operator==
?
答案 0 :(得分:1)
什么“在类中定义的友元函数在定义它的类的(词法)范围内”意味着在A的主体中声明的任何友元函数属于A的命名空间(A的词法范围)。
换句话说:
mpld3.fig_to_html()