簡體   English   中英

在Qt中發送信號時的const-ref

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM