On Mon, 06 May 2013 10:40:06 -0400, Andrei Alexandrescu
<[email protected]> wrote:
On 5/6/13 10:31 AM, Steven Schveighoffer wrote:
By "completely innocuous" you mean valid? I don't think the above is
valid.
I meant valid-looking.
OK.
It seems to compile and work for me, but I don't know what the point is,
since you are being mysterious :)
If x > 100, the code is saving a reference to a destroyed temporary. If
you couldn't see it, how many do you expect would see similar issues in
even simpler and cleaner D code?
No, I was wondering whether the compiler detects this and keeps the
temporary in scope (after all, it is in control of that temporary's
lifetime). I called cout with that temporary as the reference, and it
seems to not have clobbered it (outputs 100). I have not had such "lucky"
experience with D. Coming from the perspective of a complete compiler
ignoramus, I have no idea what is really happening :) I know that it's
common practice to throw rvalues and catch them as references, which seems
to be handled correctly by the C++ compiler.
A long time ago I wrote a logging feature for C++ that returned an
rvalue (maybe it was an rvalue reference, it was a long time ago, and I
don't have the code anymore). That would collect log messages via the <<
operator, and then when the line was through, the destructor would
output that line to the logger. The logging object fetched would either
be a dummy no-output object, or a real logger, depending on the logging
level selected. If the logger was disabled, no message was constructed,
making it somewhat lazy (any expressions in the line would obviously be
executed, just like any standard logger). It worked without a hitch as
long as we used it. The rvalue stayed allocated and valid throughout the
whole line, even though it was passed into each << operation by
reference.
Not relevant.
How so? I thought the point is you were saying that we couldn't handle
passing a ref bound to an rvalue to another function (because D destroys
it early?), that is precisely what I did. I felt it was completely
on-point.
-Steve