2015-06-16 7 views
5

Probabilmente mi sono perso qualcosa, ma non riesco a trovare alcuna informazione che i segnali non possano prendere riferimenti di valore.Qt 5: impossibile dichiarare il segnale che prende il riferimento di valore

Quindi, ho una classe con la seguente dichiarazione del segnale:

signals: 
    void messageDecoded(HTDataMsg &&msg); 

Quando provo a compilarlo, ho ottenuto gli errori:

moc_htcodec.cpp: In static member function ‘static void HTCodec::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)’: 
moc_htcodec.cpp:71:77: error: cannot bind ‘HTDataMsg’ lvalue to ‘HTDataMsg&&’ 
     case 0: _t->messageDecoded((*reinterpret_cast< HTDataMsg(*)>(_a[1]))); break; 
                      ^
In file included from moc_htcodec.cpp:9:0: 
../hterm_core/htcodec/htcodec.h:59:9: error: initializing argument 1 of ‘void HTCodec::messageDecoded(HTDataMsg&&)’ 
    void messageDecoded(HTDataMsg &&msg); 
     ^
make: *** [moc_htcodec.o] Error 1 

e del Codice in moc-file generato è effettivamente sbagliato:

void HTCodec::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) 
{ 
    if (_c == QMetaObject::InvokeMetaMethod) { 
     HTCodec *_t = static_cast<HTCodec *>(_o); 
     switch (_id) { 
     case 0: _t->messageDecoded((*reinterpret_cast< HTDataMsg(*)>(_a[1]))); break; 
     default: ; 
     } 
    } else if (_c == QMetaObject::IndexOfMethod) { 
     int *result = reinterpret_cast<int *>(_a[0]); 
     void **func = reinterpret_cast<void **>(_a[1]); 
     { 
      typedef void (HTCodec::*_t)(HTDataMsg &&); 
      if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&HTCodec::messageDecoded)) { 
       *result = 0; 
      } 
     } 
    } 
} 

È previsto questo comportamento? È illegale che i segnali prendano riferimenti di valore?

Se cambio HTDataMsg &&msg a, diciamo, const HTDataMsg &msg, quindi ovviamente funziona.

+3

Perché si desidera segnalare con riferimenti di rvalue (e si pensa che possano avere più ricevitori per quello)? – Jarod42

+0

Hmm. Volevo che evitassero di copiare le spese generali, ma, beh, non ho pensato a più ricevitori (anche se sono impossibili nella mia particolare applicazione). Ok, mio ​​male, sono davvero illegali. Grazie. –

+1

Se sai che sono illegali, prendi un '&' e 'move' fuori da esso. Stai attento. – Yakk

risposta

4

È illegale per i segnali eseguire i riferimenti di valore?

Sì. Non ha senso per loro prendere riferimenti di valore, dal momento che il numero di ricevitori è un numero intero non negativo. I riferimenti di valore valgono solo per il caso speciale di zero o di un ricevitore, e anche in quel caso, richiederebbe una versione di Qt solo per C++ 11.

Se si ritiene che tale ottimizzazione abbia senso per tipi di dati comuni (misurare e confermare le asserzioni per benchmark!), Potrebbe essere implementata per Qr 5.7 in poi, poiché richiede il supporto C++ 11 dalla piattaforma. Ciò richiederebbe il supporto da moc e dalla stessa libreria.

Problemi correlati