[英]const-ref when sending signals in Qt
這是我從來沒有用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 doc中似乎都有const-ref parm,但它是如何工作的?
根據這個答案 ,Qt只是用副本替換const引用。
編輯:顯然並非總是這樣...我只是用一個線程做了一個基本的測試程序,並且正確傳遞了引用。 它的常數也保持不變。 無論如何,是的,你確實需要警惕超出范圍的變量,而且你不能以這種方式跨線程發送引用。 如果您這樣做,只會傳遞副本。
要回答示例評論中的問題,是的,無論是直接連接還是排隊連接,它都能正常工作。 如果它是直接連接,它將起作用,因為someSlot()
將在someFunction()
完成之前執行; 如果它是一個排隊連接,它將起作用,因為test
將被復制而不是通過引用傳遞。
這是一個很好的演示,展示了Qt信號/插槽如何管理復制: http : //www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/
在Qt中,當發出連接到插槽或插槽的信號時,它等同於同步函數調用...除非你已經將信號和插槽配置為使用排隊連接,那么它是異步調用,你應該是傳遞堆棧數據時要小心,並且應該傳遞副本,就像將數據傳遞給另一個線程一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.