果たして、私はオーバーロードを詳細に解説できるだろうか。オーバーロードは理解しているつもりである。しかし、オーバーロードを解説となると、これは難しい。
いつも通り、訳語は問題だ。たとえば、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:
Post a Comment