为什么编译器无法将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;
}
答案 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引用不能绑定到临时引用。