7

QtConcurrent::run用来运行一个函数,并通过引用传递值,但是值的内存地址不同。

但是如果我通过指针传递值,地址是一样的!我想不通。我错过了什么吗?

这是代码。

void ptr(QString* s)
{
    qDebug() << "pass by ptr: " << s;
}

void ref(QString& s)
{
    qDebug() << "pass by ref: " << &s;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString str;
    QFuture<void> f1 = QtConcurrent::run(ptr, &str);
    f1.waitForFinished();

    QFuture<void> f2 = QtConcurrent::run(ref, str);
    f2.waitForFinished();

    qDebug() << "address of str: " << &str;

    return a.exec();
}

输出:

pass by ptr:  0x28fefc
pass by ref:  0x525de4
address of str:  0x28fefc
4

2 回答 2

13

QtConcurrent::run创建您传递给它的所有参数的内部副本。然后您的线程函数可以访问这些副本,而不是原始参数。通过原始引用传递某些内容不会阻止创建副本。换句话说,在QtConcurrent::run内部强制执行按值传递的语义。

您在ref函数中看到的地址是该内部副本的地址。

出于这个原因,如果您特别想要访问原始对象,而不是裸引用,您必须使用具有指针语义或“可复制引用”语义的东西。

于 2014-08-02T03:59:47.813 回答
7

如果您想/需要使用参考,请使用 std::ref。新代码将是:

#include <functional>
...

QFuture<void> f2 = QtConcurrent::run(ref, std::ref(str));
于 2014-08-02T08:34:06.697 回答