Передача const QByteArray в перегруженную функцию - PullRequest
0 голосов
/ 02 мая 2018

У меня есть следующая перегруженная функция

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Основная причина заключается в том, что 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;
}
0 голосов
/ 02 мая 2018

Поскольку первая перегрузка принимает неконстантную QByteArray, она не привыкает.

C ++ имеет функцию под названием Преобразование конструкторов . Это означает, что конструктор с одним аргументом, который не помечен как explicit, может автоматически использоваться для преобразования одного типа в другой для разрешения перегрузки функции.

QString имеет такой конструктор , который принимает const QByteArray&. Поэтому при выборе используемой перегрузки функции компилятор может сначала преобразовать QByteArray в QString с помощью этого конструктора, а затем перейти к передаче этого QString во вторую функцию.

Пожалуйста, см. http://en.cppreference.com/w/cpp/language/overload_resolution для получения дополнительной информации.

...