我正在考虑N3797的工作草案。引用自3.3.1 / 4
朋友声明(11.3)可能会引入(可能不可见)名称 进入封闭的命名空间
进一步在3.3.2 / 11中我找到了
朋友声明指的是作为成员的函数或类 最近的封闭命名空间,但他们不会引入新的名称 那个名称空间。
所以朋友声明宣布的名字是不可见的,或根本没有介绍?
答案 0 :(得分:4)
可以通过Argument Dependent Lookup找到它,但只能这样。
E.g。你可以用这种方式实现一个比较运算符:
struct Point
{
int x, y;
friend
auto operator<( Point const a, Point const b )
-> bool
{
// compare and return true or false
}
};
名称(此处operator<
)在封闭范围内不可见,但在使用Point
类型的参数调用函数时找到。
目前的规则旨在与所谓的 Barton-Nackman trick 向后兼容。
引用维基百科的文章:
“在调查从C ++编程语言中删除朋友姓名注入的可能性时,发现Barton和Nackman的习语是该语言规则的唯一合理使用。最终,参数依赖查找的规则被调整为用上面描述的不那么激烈的机制取代朋友姓名注入,这保持了Barton和Nackman技术的有效性“
其中“朋友名称注入”指的是名称确实在封闭范围内可见的早期规则。