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 ;-}

Reply via email to