如此处所述C++11 风格的 SFINAE 和模板实例化上的函数可见性类成员函数掩盖了自由函数。使用完全限定名称通常是有效的,但是我在使用内联声明的其他类的友元函数时遇到了困难。考虑以下示例:
namespace N {
struct C {
friend int f(const C& c) {
return 1;
}
friend int g(const C& c) {
return 2;
}
};
struct D {
void f() {
g(C{}); // ADL finds this
::N::f(C{}); // not found dispite full qualification
}
};
}
我想我明白问题是什么,如此处所述内联友元函数的范围是什么?内联友元函数通常使用 ADL 发现,并且在封闭的命名空间中并不真正可见。
所以我的问题是我应该如何更改我的代码才能使这项工作正常进行(除了重命名其中一个 f 之外)?
这是因为friend
liness:
[C++11: 7.3.1.2/3]:
如果非本地类中的友元声明首先声明了一个类或函数,则该友元类或函数是最内层封闭命名空间的成员。在该命名空间范围内提供匹配的声明之前,无法通过简单的名称查找找到好友的名称 [...]。如果调用友元函数,则可以通过名称查找来找到其名称,该名称查找考虑来自与函数参数类型关联的命名空间和类的函数 (3.4.2)[IE。日常生活活动].
解决方法是简单地提供该声明:
namespace N {
struct C {
friend int f(const C& c) {
return 1;
}
friend int g(const C& c) {
return 2;
}
};
int f(const C& c);
int g(const C& c);
struct D {
void f() {
g(C{});
::N::f(C{});
}
};
}
(现场演示)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)