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.
Perché si desidera segnalare con riferimenti di rvalue (e si pensa che possano avere più ricevitori per quello)? – Jarod42
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. –
Se sai che sono illegali, prendi un '&' e 'move' fuori da esso. Stai attento. – Yakk