代码如下:
#include <iostream>
using std::cout;
void f(char a)
{
cout<<a;
}
void g(char& b)
{
cout<<b;
}
void h(const char& c)
{
cout<<c;
}
int main()
{
char c = 'd';
unsigned char uc = 'e';
signed char sc = 'f';
f('a');
f(49);
f(3300);
f(c);
f(uc);
f(sc);
g('a');
g(49);
g(3300);
g(c);
g(uc);
g(sc);
h('a');
h(49);
h(3300);
h(c);
h(uc);
h(sc);
}
gcc6.1 编译结果如下:
[chaos@localhost cpp]$ g++ -o 5.6 5.6.cpp
5.6.cpp: 在函数‘int main()’中:
5.6.cpp:24:9: 警告:隐式常量转换溢出 [-Woverflow]
f(3300);
^
5.6.cpp:29:8: 错误:用类型为‘char’的右值初始化类型为‘char&’的非常量引用无效
g('a');
^
5.6.cpp:8:6: 附注: 初始化‘void g(char&)’的实参 1
void g(char& b)
^
5.6.cpp:30:7: 错误:用类型为‘char’的右值初始化类型为‘char&’的非常量引用无效
g(49);
^
5.6.cpp:8:6: 附注: 初始化‘void g(char&)’的实参 1
void g(char& b)
^
5.6.cpp:31:9: 警告:隐式常量转换溢出 [-Woverflow]
g(3300);
^
5.6.cpp:31:9: 错误:用类型为‘char’的右值初始化类型为‘char&’的非常量引用无效
5.6.cpp:8:6: 附注: 初始化‘void g(char&)’的实参 1
void g(char& b)
^
5.6.cpp:33:7: 错误:用类型为‘char’的右值初始化类型为‘char&’的非常量引用无效
g(uc);
^
5.6.cpp:8:6: 附注: 初始化‘void g(char&)’的实参 1
void g(char& b)
^
5.6.cpp:34:7: 错误:用类型为‘char’的右值初始化类型为‘char&’的非常量引用无效
g(sc);
^
5.6.cpp:8:6: 附注: 初始化‘void g(char&)’的实参 1
void g(char& b)
^
5.6.cpp:38:9: 警告:隐式常量转换溢出 [-Woverflow]
h(3300);
^
理论基础: 对T&的初始化必须是一个类型T的左值。
对const T&的初始化不必是一个左值,甚至可以不是类型T的;
在这种情况下:
首先,如果需要将应用到T的隐式类型转换
而后将结果存入一个类型T的临时变量
最后,将此临时变量用作初始式的值