在Qt中发送信号时的const-ref

chi*_*uba 26 c++ qt signals-slots const-reference pass-by-const-reference

这是我从来没有用const-ref得到的东西,我真的希望有人可以向我解释.

当调用另一个函数内部的函数时,我得到的const-ref是传递我不打算篡改的堆栈对象的最佳方法.例如:

void someInnerFunction(const QString& text) {
    qDebug() << text;
}

void someFunction() {
    QString test = "lala";
    ....
    someInnerFunction(test);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我觉得这么好.但信号怎么样?传递参考文件是否存在任何风险?即便如此const.感觉就像我一直在阅读关于const-ref的所有文档,但我仍然觉得有点冒险,因为我将其理解为"发送一个对象的引用并保持它const".如果它所指的对象超出范围怎么办?

例如:

void someFunction() {
    connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&)));

    QString test = "lala";
    emit someSignal(test);

    // doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied. 
}

void someSlot(const QString& test) {
    qDebug() << test; // will this work?
}
Run Code Online (Sandbox Code Playgroud)

这里到底发生了什么?我经常在函数调用中使用const-ref,我只想访问该对象但不更改它.但信号怎么样?大多数信号在Qt doc中似乎都有const-ref parm,但它是如何工作的?

Ant*_*ony 22

根据这个答案,Qt只是用副本替换const引用.

编辑:显然并非总是如此...我只是用一个线程做了一个基本的测试程序,并且正确传递了引用.它的常数也保持不变.无论如何,是的,你确实需要警惕超出范围的变量,而且你不能以这种方式跨线程发送引用.如果您这样做,只会传递副本.

要回答示例评论中的问题,是的,无论是直接连接还是排队连接,它都能正常工作.如果它是直接连接,它将起作用,因为someSlot()它将在someFunction()完成之前执行; 如果它是一个排队的连接,它将起作用,因为test将被复制而不是通过引用传递.

  • 你在哪里读到的?我所看到的是"对于直接连接,建议通过const引用传递值以避免不必要的副本.对于排队连接,无论您如何传递参数,Qt都会复制" (6认同)