2017-02-22 7 views
4
void f(int & i){ 
    cout << "l-value-ref" << endl; 
} 

void f(int && i){ 
    cout << "r-value-ref" << endl; 
} 

上記のコードを前提とすると、それぞれl値参照とr値参照のパラメータをとるオーバーロードされた関数があります。l値参照とr値参照におけるバインディングエラー

int x = 5; 
f(x); 
f(5); 
const int j = 9; 
f(j); 

私はのconst int型J = 9コンパイラが曖昧エラーを与える使用しています。どうすればこの問題を解決できますか?

+0

'f()'を 'const int&i'パラメータに変更します。 –

+0

私はあなたのコンパイラがあなたにそのエラーを与えるのに驚いています。私の場合は、 "int型の参照にバインディングconst intを代入し、修飾子を破棄"します。 – SingerOfTheFall

+3

* ambiguity *エラーが出た場合、どちらも 'int const'型の引数' j'で呼び出すことができないので、このエラーは誤解を招く**と思います。コンパイラは* "int const&' "*を受け付ける関数が見つかりません。 – Nawaz

答えて

6

あなたのコンパイルエラー(実際に言及している場合)は誤解を招きます。ここで本当に間違っているのは、いずれの関数にもconst int引数を渡そうとすると、許可されていないconst修飾子が破棄されるということです。シグネチャをconst int&/const int&&に変更することで解決できます(const int&&は引き続きconst int引数では機能しません)。また、実現する具体的な内容に応じて、const引数の別のオーバーロードを追加して解決できます。

基本的には、「渡された参照を変更する必要があるバージョンが2つ必要です」と「渡された参照は決して変更しません」(const int&バージョン)。

関連する問題