我的同事在无状态类中定义了一系列函数(在我看来应该是自由函数)作为静态成员函数。
由于此类已定义并使用嵌套命名空间中的类型,因此我希望使用ADL编写较少的非有用代码。但他们的选择是否只是打破了ADL的目的?
namespace nested_long_namespace_name
{
struct type {};
struct interface { static void f(type) {} };
}
int main()
{
nested_long_namespace_name::type value{};
f(value); // ERROR (ADL does not kick in)
interface::f(value); // ERROR (ADL does not kick in)
nested_long_namespace_name::interface::f(value); // OK
}
现在,我的问题是:是否有一种解决方法,将f
定义为命名空间nested_long_namespace_name
中的自由函数?
答案 0 :(得分:6)
依赖于参数的查找仅查找声明为in namespaces的声明,并且仅在unqualified lookup期间发生。因此,ADL永远不会适用于interface::f(value)
,但它确实适用于f(value)
。但是名称f
只会在名称空间nested_long_namespace_name
下查找 - 我们不会继续查找在那些关联名称空间中为静态函数或名为{{1}的数据成员查找的类}。
这遵循典型的名称查找模型 - 您可以使用 using-directive 将命名空间纳入范围,但没有等效的将静态类成员引入范围。
所以是的,ADL无法找到f
。