c++关于类型强转后作为引用参数的一些问题
typedef unsigned char byte; void fuckme(byte& byValue); // 其他人的接口 // 我现在来调用 const byte byValue = 11; fuckme(byValue); // 编译错误 fuckme(const_cast<byte>(byValue)); // 编译错误 fuckme(reinterpret_cast<byte>(byValue)); // 编译错误 fuckme((byte)(byValue)); // vs2008下通过,gcc编译错误
找到了两篇介绍的文章:
强制转换和引用参数的问题
C++函数, 对非const引用参数不允许做类型转换,例如: void update(float& i); void g(double d, float r) { update(2.0f); //错误 update(r); //传递r的引用 update(d); //错误,要求类型转换 } 一个void函数可以将另一个void函数作为它的return语句中的表达式,例如: void g(int* p); void h(int* p) { return g(p); //可以,返回无值 } 函数重载只重载参数类型和参数个数,不重载返回类型 在不同的非名字空间作用域里声明的函数不算是重载,例如: void f(int); void g() { void f(double); f(1); //调用f(double) } 在同一个作用域中随后的声明里,默认参数都不能重复或者改变,例如: void f(int x = 7); void f(int = 7); //错误,默认参数不能重复 void f(int = 8); //错误,默认参数不能改变 void f(int); //可以,函数可以重复声明 void g() { void f(int x = 9); //可以,这个声明将遮蔽外层的声明 } void error(string s); void(*f1)(string) = &error; //可以 void(*f2)(string) = error; //也可以,与&error意思一样 void g() { f1("vasa"); //可以 (*f1)("mary rose"); //也可以 } 宏名字不能重载,而且宏预处理器不能处理递归调用 ##宏运算符可以拼接两个串,构造出一个新串,例如: #define NAME2(a,b) a##b int NAME2(hack,cah)();将产生int hackcah(); #undef X保证不再用称为X的有定义的宏--无论在此指令之前有还是没有。
对非const引用参数不允许做类型转换
标准规定了只有const &才可以引用临时对象。你的强制转换实际上是产生了临时对象的
如果是强转的话会产生临时变量,也就是右值,右值不能赋值给& ,只能赋值给CONST & 看来事这个原因了,我用的VS2005没产生错误,看来标准支持的并不好
看来是同类型转换,编译做了优化处理,并没有做转换过程
http://www.cnblogs.com/likebeta/archive/2013/01/16/2862510.html