On Mon, 14 Dec 2009 23:38:34 +0300, Andrei Alexandrescu <[email protected]> wrote:

Denis Koroskin wrote:
On Mon, 14 Dec 2009 21:06:20 +0300, dsimcha <[email protected]> wrote:

I mentioned this deep in another thread, but I think it deserves its own
thread.  Can we get something like:

void doStuff(T)(const ref T val) {
    // do stuff.
}

T getVal() {
    return someValue;
}

void main() {
    doStuff(getVal());  // Doesn't currently work.
}

For non-const ref parameters, it's understandable that passing rvalues in doesn't work because this is likely a bug that the compiler should catch. However, for const ref parameters, can't the compiler just implicitly put the value on the caller's stack frame and convert it to an lvalue rather than forcing the programmer to write the boilerplate to do this manually? This
would result in:

doStuff(getVal()); -->

auto __temp = getVal();
doStuff(__temp);
I agree it hurts a lot. I faced the same problem implementing RefCounted: you can't return RefCounted object from one function and pass it by reference to another one. Passing it by value is not a good option.

The compiler will optimize that case.

Andrei

How can it optimize away a function with a side effect (RefCounted ctor/dtor invokes an interlocked increment/decrement that theoretically may destroy an object, but wouldn't in practice)? Make it special for compiler?

Reply via email to