我有以下重载功能
void testFun(QByteArray& arr){
QTextStream out(stdout);
out << "QByte" << endl;
}
void testFun(QString str){
QTextStream out(stdout);
out << "QStr" << endl;
}
如果我使用void testFun(QString str)
作为参数,为什么调用函数const QByteArray
。
这意味着 - 这段代码:
QByteArray bA("aaa");
const QByteArray bB(bA);
testFun(bA);
testFun(bB);
给出以下输出:
QByte
QStr
答案 0 :(得分:1)
由于第一个重载采用非const QByteArray
,因此不会使用它。
C ++有一个名为Converting Constructors的功能。这意味着可以自动使用未标记为explicit
的单参数构造函数将一种类型转换为另一种类型以进行函数重载解析。
QString
such a constructor const QByteArray&
QByteArray
。因此,在选择要使用的函数重载时,编译器可以先使用该构造函数将QString
转换为QString
,然后继续将ngClass
传递给第二个函数。
有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/overload_resolution。
答案 1 :(得分:0)
根本原因是Qt(以及扩展名:你!)允许编写非类型安全代码:从QByteArray
到QString
的隐式转换。在项目范围内定义QT_RESTRICTED_CAST_FROM_ASCII
,擦除构建文件夹并重建项目。使用const对象的调用不会编译,你必须修复函数签名:你应该一直在使用const引用。
void testFun(const QByteArray &arr){
QTextStream out(stdout);
out << "QByte" << endl;
}
void testFun(const QString &str) {
QTextStream out(stdout);
out << "QStr" << endl;
}