4

はなぜコンパイラはint&charを促進することができませんが、参照ツーのconst(int const&char)によってそれを渡すときに問題はありませんか?参照渡しと積分プロモーション

例コード:

#include <iostream> 
using namespace std; 

void func1(int & i)  { cout << "int &  " << i << endl; } 
void func2(int const & i) { cout << "const int & " << i << endl; } 

int main() { 

    char mychar = 'a'; 
    func1(mychar); // compiler-error 
    func2(mychar); // no error 

    return 0; 
} 

答えて

4

これは許可されています

char c = 'X'; 
const int& i = c; 

我々は暗黙のうちにintcを促進し、その一時的にiを結合しています。これは本当に混乱するような行動につながることはありません。 iには同じ値のcがありましたが、それはちょうど異なるタイプです。同じロジックがで許可された場合

しかし、何が起こるか - const

char c = 'X'; 
int& i = c; 
i = 'J'; 

i

cに直接結合することはできません - それは間違ったタイプです。 cintに昇格し、 iを一時的にバインドする必要があります。しかし、私たちが iを割り当てたときには、私たちがバインドしたその一時的なものを変更しています - cはまだ Xです。それは信じられないほど混乱し、直感的ではなく、エラーを起こしやすいでしょう。だからその言語はそれを禁じている。

2

プロモーションと変換が新しい一時オブジェクトを作成します。非const参照は一時オブジェクトにバインドできません。