2017-02-06 31 views
19

find_typeはどのように機能がtypemapであるかを知っていますか?
受け取る引数は、そのネームスペースからではなく、std名前空間です。なぜこのADLのケースが機能していますか?

このコードはどのように機能しますか?これを可能にするルールは何ですか?

私はそれをGCC 6.3でテストし、3.9.1でテストしました。

+6

構造体 'find_type'からのテンプレートパラメータ' T'のパラメータ型は 'std :: unique_ptr 'です。 'std :: unique_ptr'はADLの' test :: Test'テンプレートパラメータを考慮して 'test' NSの' typemap'関数を探します – SebNag

答えて

19
C++標準N4618で

§3.4.2[basic.lookup.argdep](2.2)

Tは(組合を含む)クラス型である場合、それに関連するクラスがある:クラス自体。それがあるクラス もしあればメンバー。その直接的および間接的な基底クラスです。関連する名前空間は、関連付けられたクラスの名前空間を囲む最も内側の です。さらに、Tがクラステンプレートの特殊化である場合、 の関連する名前空間およびクラスには、も含まれます。テンプレートタイプパラメータ(テンプレートテンプレート パラメータを除く)のテンプレート引数の タイプに関連付けられた名前空間およびクラス。テンプレートテンプレート引数がメンバである名前空間。テンプレートテンプレート引数として使用されるメンバテンプレートのすべてがメンバーであるクラス があります。

typemapの引数がstd::unique_ptr<test::Test>なので、名前空間testは名前をルックアップすると考えられています。

14

受け取る引数は、その名前空間からではなく、std名前空間からのものです。

すべてではありません!

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

これは、次のとおりです。名前空間testがあまりにも検索されるよう

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

が、そこでtest::をあります。

関連する問題