Ho un codice Qt che ho scaricato dal mio repository SVN. È da un po 'che ci ho lavorato ma sono sicuro che è stato usato per compilare.Passa rvalue come riferimento
Ho una nuova versione di Qt e del compilatore (rispetto a quello che avevo nell'ultima volta). Il mio attuale compilatore è: mingw 4.9.2 a 32 bit.
ecco il mio codice problema:
QByteArray dataBlock = audioTestFile.read(PACKET_SIZE_TO_ENCODE);
// This line is the issue
uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(), dataBlock.end()));
Dove:
typedef std::vector<uint8_t> uint8Vect_t;
e
uint8Vect_t encodeData(uint8Vect_t &dataBuff);
Così si può vedere qui che ho una funzione encodeData(), che prende un parametro uint8Vect_t &
(superato da ref). Sto passando una variabile temporanea (un rvalore credo) creata usando il costruttore std :: vector (uno dei quali prende due iteratori) dagli iteratori QByteArray dataBlock
(che ho testato funziona).
Tuttavia, ottengo l'errore:
../audioTest/txaudiostream.cpp: In member function 'void CTxAudioStream::playFile()': ../audioTest/txaudiostream.cpp:212:94: error: no matching function for call to 'CTxAudioStream::encodeData(uint8Vect_t)' uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(), dataBlock.end())); ^../audioTest/txaudiostream.cpp:212:94: note: candidate is: ../audioTest/txaudiostream.cpp:36:13: note: uint8Vect_t CTxAudioStream::encodeData(uint8Vect_t&) uint8Vect_t CTxAudioStream::encodeData(uint8Vect_t &dataBuff) ^../audioTest/txaudiostream.cpp:36:13: note: no known conversion for argument 1 from 'uint8Vect_t {aka std::vector}' to 'uint8Vect_t& {aka std::vector&}'
Fondamentalmente si tratta di dire che non posso convertire da uint8Vect_t a uint8Vect_t &. Ma se passo una variabile di tipo uint8Vect_t nella funzione (piuttosto che il valore di ritorno della variabile contructor/temp), allora funziona bene.
Ho pensato che in C++ 11 puoi passare rvalues .. ma ovviamente mi manca qualcosa qui. Qualcuno può spiegare:
- Perché questo è sbagliato?
- Che cos'è una soluzione efficiente/elegante (leggibile)?
Qual era il tuo vecchio compilatore? MSVS? – NathanOliver
Non è possibile passare un valore temporaneo (valore rvalue) per riferimento non const. Passa per valore o passa per riferimento const in base alla semantica che ti aspetti (proprietà, mutabilità, ecc.). – CoryKramer
@NathanOliver C'è una buona possibilità che fosse, ero in giro con un sacco di compilatori diversi ... ma non posso essere sicuro al 100% ... ci sarebbe una differenza? la sua sintassi è corretta o no? (non essere pedante, è una domanda seria) –