Qt/GCC:按值从函数返回对象/nullptr.为什么要编译此代码

Qt/GCC: Returning an object/nullptr from a function by value. Why does this code compile?

本文关键字:为什么 nullptr 代码 对象 编译 函数 GCC Qt 返回      更新时间:2023-10-16

以下代码不使用GCC 4.8编译:

SomeClass makeObject(bool returnsNullptr)
{
    if (!returnsNullptr)
    {
        return SomeClass();
    }
    else
    {
        return nullptr;
    }
}

这是错误消息:

C:UsersHGHDocumentsGitHubPureCppReturnValueOptimizationsrcmain.cpp:64: error: could not convert 'nullptr' from 'std::nullptr_t' to 'SomeClass'
         return nullptr;
                ^

当我按值返回对象时,这是意料之中的事。但是下面的Qt代码编译后似乎运行得很好。为什么会这样?

QByteArray ResourceFileManager::loadFromFolder(const QString& folderPath, const QString& fileName)
{
    QString fullFilePath = folderPath + "/" + fileName;
    QFile file(fullFilePath);
    qDebug() << "Loading resource: " + file.fileName();
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray buffer = file.readAll();
        file.close();
        return buffer;
    }
    else {
        return nullptr;
    }
}

QByteArray的一个构造函数使用指针,因此正在为您构建一个指针。假设您的SomeClass类型有一个带有指针arg的构造函数,它的行为也会相同。