2010-02-08

オーバーロードが不安になってきた

果たして、私はオーバーロードを詳細に解説できるだろうか。オーバーロードは理解しているつもりである。しかし、オーバーロードを解説となると、これは難しい。

いつも通り、訳語は問題だ。たとえば、candidate functionsだ。候補関数だろうか。関数の候補だろうか。あるいは、候補関数群とか、候補関数集合というのが、最も正しい訳語であるように思われる。数学には疎いので、群や集合という言葉が適切かどうかは分からないが、とにかく、ひとつ以上の集合というニュアンスが含まれている。これは、オーバーロードで呼び出すべき関数の候補のセットなのだ。

Viable functionsという用語も、また難しい。Candidate functionsというのは、シグネチャさえ一致すれば、選ばれる。たとえば、

void f(int) ;
void f(int, int) ;
void g(int) ;

int main()
{
    f(0) ;// この式でのCandidate functionsは?
}

この式での、Candidate functionsは、f(int)とf(int, int)である。f(int,int)は、f(0)という式では、f(int,int)は呼び出せない。しかし、Candidate functionsとして選ばれる。g(int)は、選ばれない。

このCandidate functionsの中で、実際に、呼び出すことのできる関数を、Viable functionsという。f(0)という式では、f(int, int)を呼び出すことができないので、Viable functionsは、f(int)だけである。たとえばもし、上記のf(int, int)の宣言が、

void f(int, int = 0) ;

となっていた場合、f(int, int)も、Viable functionsになる。デフォルト実引数があり、呼び出せるからだ。

つまり、Viable functionsとは、その関数呼び出しの式で、セマンティクス上、実際に呼び出し可能な関数を意味する。

Viable functionsが複数あった場合、一体どれが、最も最適な関数であるかが、決定される。この最も最適な関数を、文字通り、Best viable functionと呼ぶ。同じ程度に最適なviable functionsが複数あった場合、オーバーロード解決は、曖昧となる。

しかるに、既存の参考書は、ここまで詳しくオーバーロード解決のルールを解説していない。わずかに一ページ足らずですむ、このような解説さえ、していないのである。したがって、Viable functionsという用語に対する、既存の訳語はない。私は私の拙い詩才を以て、訳語を決定しなければならないのだ。

最も、オーバーロード解決のルールは、ユーザーに取って自然になるように定義されている。ほとんどのユーザーにとっては、ルールの詳細を知らなくても、自然に感じるはずだ。

知らなくてもいいとはいえ、規格を読む以外に、知る方法がないというのは、問題である。本書の存在意義は、規格と入門書の間の、大きな隔たりを埋めるためにある。初心者向けの、C++の入門書は、すでに数多く、世に行われているが、上級者向けの解説書は、存在しない。

No comments: