繁体   English   中英

为什么这个ADL案例有效?

[英]Why this ADL case is working?

如何find_type知道函数typemap是什么?
它接收的参数不是来自该命名空间,而是来自std命名空间!

#include <type_traits>
#include <memory>

namespace lib {
    template<typename T>
    struct find_type {
        using type = decltype(typemap(std::declval<T>()));
    };
}

namespace test {
    struct Test {};
    auto typemap(std::unique_ptr<Test>) -> int;    
}

static_assert(std::is_same<int, lib::find_type<std::unique_ptr<test::Test>>::type>::value, "");

这段代码怎么样? 允许这个的规则是什么?

我用GCC 6.3和clang 3.9.1测试了它。

在C ++标准N4618§3.4.2[basic.lookup.argdep](2.2)

如果T是类类型(包括联合),则其关联的类是:类本身; 它所属的成员,如果有的话; 及其直接和间接基类。 其关联的命名空间是其关联类的最内部封闭命名空间。 此外,如果T是类模板特化,则其关联的名称空间和类还包括: 与模板类型参数 (模板模板参数除外) 提供的模板参数类型相关联的名称空间和类 ; 任何模板模板参数都是成员的名称空间; 以及用作模板模板参数的任何成员模板的类都是成员。

typemap的参数是std::unique_ptr<test::Test> ,因此名称空间test用于查找名称。

它接收的参数不是来自该命名空间,而是来自std命名空间!

不是全部!

using type = decltype(typemap(std::declval<T>()));

这是:

using type = decltype(typemap(std::declval<std::unique_ptr<test::Test>>()));

那里有一个test::所以也会搜索名称空间test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM