C++ 参考传递与整体推广

C++ 参考传递与整体推广,c++,type-conversion,pass-by-reference,overloading,integer-promotion,C++,Type Conversion,Pass By Reference,Overloading,Integer Promotion,为什么编译器不能将char升级到int&,但通过引用const(char到int-const&)传递它时没有问题 示例代码: #include <iostream> using namespace std; void func1(int & i) { cout << "int & " << i << endl; } void func2(int const & i) { cout <<

为什么编译器不能将
char
升级到
int&
,但通过引用const(
char
int-const&
)传递它时没有问题

示例代码:

#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;
}
#包括
使用名称空间std;

void func1(int&i){cout升级和转换将创建新的临时对象。非常量引用无法绑定到临时对象。

这是允许的:

char c = 'X';
const int& i = c;
我们隐式地将
c
提升到
int
并将
i
绑定到该临时项。这不会真正导致任何混淆行为。
i
具有与
c
相同的值,只是不同的类型

但是,如果非
常量允许使用相同的逻辑,会发生什么情况呢

char c = 'X';
int& i = c;
i = 'J';
i
不能直接绑定到
c
-这是错误的类型。我们仍然需要将
c
升级到和
int
并将
i
绑定到该临时对象。但是当我们分配
i
时,我们只是在修改我们绑定的临时对象-
c
仍然是
X
。这将是令人难以置信的混乱g、 不直观,容易出错。所以语言禁止这样做