传递const QByteArray至重载函数为何匹配QString版本?
为什么const QByteArray参数会调用QString版本的testFun?
这事儿说白了是C++重载匹配规则+Qt隐式转换共同作用的结果,咱们一步步理清楚:
先看你的两个重载函数的参数特性:
void testFun(QByteArray& arr):这个参数是非常量左值引用,它只能接收非const的QByteArray左值。你传bA(非const的QByteArray)的时候,完全匹配这个函数,所以输出QByte,这部分没毛病。void testFun(QString str):这个是值传递的QString参数,只要某个类型能通过隐式转换变成QString,编译器就会考虑用这个重载。
传
const QByteArray bB时的匹配逻辑:bB是const修饰的QByteArray,属于常量左值。C++里明确规定,const对象不能绑定到非const的引用上(防止函数偷偷修改const对象),所以第一个重载直接被排除了。
这时候编译器会找其他可行的重载,刚好Qt给QByteArray提供了到QString的隐式转换——QString有个构造函数QString(const QByteArray &ba),能把QByteArray直接转成QString。编译器觉得这个转换是合法的,就选了QString版本的重载,于是输出了QStr。怎么解决这个问题?
如果想让const QByteArray也调用QByteArray专属的重载,你只需要再加一个const版本的重载函数就行:void testFun(const QByteArray& arr){ QTextStream out(stdout); out << "Const QByte" << endl; }这样编译器会优先匹配这个和const QByteArray完全匹配的重载,不会再走QString的隐式转换了。
内容的提问来源于stack exchange,提问作者radfm
相关产品推荐
相关产品推荐

