通过参考和整体推广

时间:2016-03-19 11:18:20

标签: 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 << "const int & " << i << endl; }

int main() {

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

    return 0;
}

2 个答案:

答案 0 :(得分:4)

这是允许的:

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

我们隐含地将c提升为int并将i绑定到该临时。这实际上不会导致任何令人困惑的行为。 i具有相同的值c,它只是一种不同的类型。

但如果 non 允许相同的逻辑 - const会发生什么:

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

i无法直接绑定到c - 这是错误的类型。我们仍然需要将c提升为int并将i绑定到该临时值。但是,当我们分配i时,我们只是修改我们绑定的临时值 - c仍然是X。这将是令人难以置信的混乱,非直观和容易出错。所以语言禁止它。

答案 1 :(得分:2)

促销和转化会创建一个新的临时对象。非const引用不能绑定到临时引用。