[gnu.g++] Defining operators

tiemann@LURCH.STANFORD.EDU (Michael Tiemann) (11/22/89)

    Why not allow a third form, where the caller would pass as a third argument
    a reference to the place where the result should be put?

    void operator+(matrix& x, matrix& y, matrix& result) { ... }

    The previous example would translate into:
	    matrix U;
	    operator+(A,B,U);
	    operator+(U,C,X);
    and no copying would be necessary. Am I missing something obvious?

	 Daniel Ranson
	 X400: ranson@lannion.cnet.fr
	 uucp: ranson@cnetlu.fr, or ...!mcvax!inria!cnetlu!ranson

Why not allow a fourth form, using Named Return Values (see
July/August C++ Report for details of this GNU C++ language
extension):

matrix operator+(matrix& x, matrix& y) return z { ... }

This permits the compiler to give the effiency of return-by-reference
with the semantics of return-by-value.

Michael

rae%alias@csri.utoronto.ca (Reid Ellis) (11/28/89)

tiemann@lurch.stanford.edu writes:
|Why not allow a fourth form, using Named Return Values (see
|July/August C++ Report for details of this GNU C++ language
|extension):
|
|matrix operator+(matrix& x, matrix& y) return z { ... }

And look!  It's extensible!  Later we can add multiple return values!

matrix operator+(matrix& x, matrix& y) return x,y,z { ... }

Ya, dat's it..  :)

But seriously, what if operator+ is used inside an expression in this new
case?  Then the compiler generates a temp on its own, I guess..

e.g.:	A=(b+c)*2;

					Reid
---
Reid Ellis, 264 Broadway Avenue, Toronto ON, M4P 1V9, Canada
rae%alias@csri.utoronto.ca                   +1 416 487 1383

tiemann@LURCH.STANFORD.EDU (Michael Tiemann) (11/28/89)

    But seriously, what if operator+ is used inside an expression in this new
    case?  Then the compiler generates a temp on its own, I guess..

    e.g.:	A=(b+c)*2;

In fact, it does generate a temporary.  But you missed the point.  The
point was to avoid needless copying objects, not to avoid the creation
of temporaries.  It is often the case that copy elimination avoids
temporary creation, but not always.

Michael