2012-10-20

Partial Orderingの理解

とりあえずPartial Orderingに関して理解できたこと。

クラステンプレートのpartial orderingは、14.5.5.2に定義されている。その定義によれば、二つのクラステンプレートを比較する際、ある手順に従って、クラステンプレートを関数テンプレートに変換して、関数テンプレートのpartial orderingとして比較する。つまり、関数テンプレートのpartial orderingの定義に丸投げしているわけだ。

関数テンプレートのpartial orderingは、14.5.6.2に定義されている。その定義によれば、二つの関数テンプレートの家、一方にある変換を加えて、変換されたテンプレートと、他方の変換されていないオリジナルのテンプレートを、14.8.3.4にしたがって比較する。これは、二つのテンプレートの両方向に対して行われる。

14.8.2はテンプレート実引数推定であり、その下にある14.8.2.4は、partial orderingの際のテンプレート実引数推定について定義している。

一方の関数テンプレートの関数仮引数の型を他方の対応する関数仮引数の型と比較して、関数テンプレートのすべての型が、少なくとも同じほど特殊化されており、またある型に対しては、より特殊化されている方が、より特殊化されているテンプレートであるとする。これは、オーバーロード解決と同じだ。

しかし、肝心の個々の型同士の比較方法は、14.8.2.5に丸投げされている。

しかし、14.8.2.5は、どちらがより特殊化されているかということは直接定義していないように思う。ただ、推定が失敗するという記述ならある。

比較は両方向に対して行われるので、ある方向で失敗して、他の方向で成功した場合、より特殊化されていると言えるのだろうか。よくわからない。

No comments: