这是我在 const-ref 中从未完全理解过的事情,我真的希望有人可以向我解释。
当在另一个函数内部调用一个函数时,我知道 const-ref 是传递我不打算篡改的堆栈对象时的最佳方式。例如:
void someInnerFunction(const QString& text) {
qDebug() << text;
}
void someFunction() {
QString test = "lala";
....
someInnerFunction(test);
}
到目前为止一切都很好,我猜。但是信号呢?传递引用是否有任何风险?即使它是 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?
}
这里到底发生了什么?我经常在函数调用中使用 const-ref,我只想访问对象但不更改它。但是信号呢?大多数信号在 Qt 文档中似乎都有 const-ref parm,但它是如何工作的?
最佳答案
根据this answer , Qt 只是将 const 引用替换为拷贝。
编辑:显然情况并非总是如此......我只是用一个线程做了一个基本的测试程序,并且引用被正确传递。它的 const-ness 也保持不变。无论如何,是的,您确实需要警惕变量超出范围,而且您不能以这种方式跨线程发送引用。如果这样做,则只会传递拷贝。
要回答您示例评论中的问题,是的,无论是直接连接还是排队连接,它都会起作用。如果是直接连接,它会起作用,因为 someSlot()
将在 someFunction()
完成之前执行;如果它是一个排队连接,它将起作用,因为 test
将被复制而不是通过引用传递。
关于c++ - 在 Qt 中发送信号时的 const-ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10405739/