ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[C++] リファレンス型とオーバーロード

 
リファレンス型で関数オーバロードを試す。
void foo(int i){ }
void foo(int& i){ }

int main(){
        return 0;
};
これは問題なくコンパイルできた。
しかし、実際にこれらの関数を呼び出すと
void foo(int i){ }

void foo(int& i){ }

int main(){
int i;
foo(i);
return 0;
};

C:temp>g++ tmp3.cc

tmp3.cc: In function `int main()':
tmp3.cc:6: error: call of overloaded `foo(int&)' is ambiguous
tmp3.cc:1: note: candidates are: void foo(int)
tmp3.cc:2: note: void foo(int&)

曖昧な呼出しということでコンパイラが通らない。

そこで「プログラミング言語C++[第2版]」を参照。
任意の型 T について、T と T& では受理する初期設定子値の集合が同じであるため、引数型がこの点においてのみ異なる関数は、同じ名前を持ってはならない.例えば、

    int f(int i)

{
// . . .
}
int f(int& i) //エラー: 関数型の違いが充分でない
{
// . . .
}

(r.13 多重定義より)


初期設定子値の集合?
次の例を考えると int i, j は 即値(リテラル)を受け付けるのに対して、int& k は受け付けない。
初期設定子値の"集合"は異なるように思うが。。
int i = 1;
int j = i;
int& k = i;


どいうことだろうか。
その答えは多分、r.13.2 引数の一致 にある。
769頁
順序だけが異なる自明変換の列は区別できない。型T,const T,volatile T,T&,
const T&,及び,volatile T&の引数を持つ関数は,正確に同じ値集合を受理することに注意されたい.

<<デフォルトコンストラクタ | ホーム | 配列の要素の次のアドレス>>

コメント

コメントの投稿

管理者にだけ表示を許可する

画像の文字を半角数字で下記ボックスに記入ください。
文字が読みにくい場合はブラウザの更新をすると新しい文字列が表示されます。