通过引用和整体推广

Pass-by-reference and integral promotion

本文关键字:引用      更新时间:2023-10-16

为什么编译器不能将char提升到int&,但在通过引用到常量(charint 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;
}

这是允许的:

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

我们正在隐式地将c提升为int,并将i绑定到该临时。这不会真正导致任何令人困惑的行为。 i具有c相同的值,只是类型不同。

但是,如果允许对非const使用相同的逻辑会发生什么:

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

i不能直接绑定到c - 它是错误的类型。我们仍然需要促进cint,并将i绑定到那个临时。但是当我们分配i时,我们只是在修改我们绑定的临时 - c仍然是X。这将是令人难以置信的混乱,不直观且容易出错。所以语言禁止它。

升级和转化会创建新的临时对象。非常量引用不能绑定到临时引用。