使ADL与静态成员函数一起使用

时间:2017-09-19 13:24:39

标签: c++ language-lawyer

我的同事在无状态类中定义了一系列函数(在我看来应该是自由函数)作为静态成员函数。
由于此类已定义并使用嵌套命名空间中的类型,因此我希望使用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中的自由函数?

1 个答案:

答案 0 :(得分:6)

依赖于参数的查找仅查找声明为in namespaces的声明,并且仅在unqualified lookup期间发生。因此,ADL永远不会适用于interface::f(value),但它确实适用于f(value)。但是名称f只会在名称空间nested_long_namespace_name下查找 - 我们不会继续查找在那些关联名称空间中为静态函数或名为{{1}的数据成员查找的类}。

这遵循典型的名称查找模型 - 您可以使用 using-directive 将命名空间纳入范围,但没有等效的将静态类成员引入范围。

所以是的,ADL无法找到f