On Thu, May 31, 2007 at 10:08:18PM +0200, Lars Gullik Bjønnes wrote: > Richard Heck <[EMAIL PROTECTED]> writes: > > | Andre Poenitz wrote: > | > On Thu, May 31, 2007 at 09:12:56PM +0200, Peter Kümmel wrote: > | > > | >>> I tried to do something like this so I didn't have the same code in two > | >>> places: > | >>> QModelIndex & QCitationDialog::getSelectedIndex(QListView *) { > | >>> QModelIndexList const selIdx = > | >>> availableLV->selectionModel()->selectedIndexes(); > | >>> if (selIdx.empty()) > | >>> return QModelIndex(); //this is an invalid one. > | >>> return selIdx.first(); > | >>> } > | >>> But that failed: warning: returns reference to temporary. Any ideas how > | >>> to avoid this and still return a reference? Or could I return a smart > | >>> > | >> returning "const QModelIndex &" should be save. But you could also > | >> return may value, copying QModelIndex isn't that expensive. The Qt > | >> code return often by value, QModelIndex was designed for this. > | >> > | > Apart from that > | > > | > QModelIndex & QCitationDialog::getSelectedIndex(QListView *) { > | > ... > | > if (selIdx.empty()) > | > return QModelIndex(); //this is an invalid one. > | > > | > returns a reference to a temporary, which is useless in any case > | > as accessing it will invoke undefined behaviour. > | > > | Yes, the question was how to avoid doing that and still return a > | reference, if there is any such way. > > When returning by copy you could give the temporary a name to let the > compiler use NRVO. (Optimization technique used by compilers.)
To elaborate a bit on this: It would be somehting like QModelIndex QCitationDialog::getSelectedIndex(QListView *) { QModelIndex idx; ... if (selIdx.empty()) { idx = QModelIndex(); } else.... return idx; } Andre' PS: Note that we are talking about _GUI stuff_, not libc's strlen() implementation ;-}