Tipo di argomento per segnale Qt e slot, i qualificatori di riferimento const sono importanti?

Per segnale e slot di tipo inferiore

signals: void textChanged(const QString &); public slots: void setText(const QString & text) 

il tipo di argomento di textChanged e setText sembra funzionare invarable di const e & . La qualifica costante e di riferimento fa alcuna differenza rispetto all’utilizzo di QString?

 QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString))); QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &))); 

EDIT: non ho notato la finestra di output che mostra i messaggi di errore quando è utilizzato il tipo incompatibile in SIGNAL o SLOT. Ho pensato che il meccanismo dello slot del segnale sia in grado di rilevare l’errore del tipo di argomento in fase di compilazione.

Qt controlla una firma normalizzata , significato

La normalizzazione riduce al minimo lo spazio bianco, sposta ‘const’ in primo piano laddove appropriato, rimuove ‘const’ dai tipi di valore e sostituisce i riferimenti const con i valori.

Disclaimer: Il mio qt è piuttosto arrugginito, ma il meccanismo signal / slot è ancora solo chiamate di funzione C ++. Se il meccanismo segnale / slot copia effettivamente gli oggetti nella memoria interna, mi scuso (dovrete controllare le pagine Qt, ce n’è una grande su segnali / slot afaik) – poiché i bit sottostanti saranno rilevanti solo in un contesto C ++, non in un contesto C ++ + Qt.

Se si omette il riferimento, la stringa verrà copiata (e non avendo importanza il const, le eventuali modifiche apportate rimarranno nella sola funzione).
Se lasci nel riferimento ma estrai il const, consenti al metodo di modificare la stringa che gli dai. Entrambi funzionano, ma fanno cose diverse per l’object che si passa (quantità di copia / possibilità di modifiche di conservazione).

Ti suggerisco di leggere le seguenti risorse:

(sulla correttezza costante) https://isocpp.org/wiki/faq/const-correctness

(sui riferimenti) https://isocpp.org/wiki/faq/references

per capire esattamente cosa passa un parametro e come void foo(const A&) / void foo(const A) / void foo(A&) / void foo(A) sono tutti diversi.