> void f(int& i)
> {
[quoted text clipped - 4 lines]
> f(d);
> //would you expect d to be 10?
Yes, I see. In fact, i would expect the compiler to refuse this outright, it
just makes no sense at all! Using intrinsic type promotions on references
like this, tsk, tsk, naughty compiler... Pascal doesn't allow this! Does C#?
I hope not :-))
But, that's not my situation. I have X as a "polymorphic worker class", and
it may or not change inside X, I don't care. I just want to it passed to F
to get polymorphic behaviour in F depending on the calling context).
Sort-of:
BaseX
{ virtual f() }
X1:BaseX { overridden virtual F() }
X2, X3...
and then F(BaseX&) gets called like this: F(X1(params)), F(X2(params)),
F(X3(params)) etc...
Goran.
Doug Harrison [MVP] - 23 Sep 2005 16:19 GMT
>But, that's not my situation. I have X as a "polymorphic worker class", and
>it may or not change inside X, I don't care. I just want to it passed to F
[quoted text clipped - 6 lines]
>and then F(BaseX&) gets called like this: F(X1(params)), F(X2(params)),
>F(X3(params)) etc...
I talked about this problem here and in the message referenced from 1997:
http://groups.google.com/group/microsoft.public.vc.stl/msg/0e2c9910ccae9bfd
The solution (kludge) I settled on was to make F take a spuriously const
X1&, which is fine unless the class stores a reference or pointer to the
object. The problem with a const X& parameter then is that it's very easy
to slip up and pass a temporary, which will be destroyed at the end of the
expression containing the function call, long before the class has finished
using it.
I once posted this as an example of a sort of built-in joke concerning the
whole rvalue/lvalue/reference behavior:
*****
http://groups.google.com/groups?selm=31bsovcdd32iedsj2utmqlmd78li40m7p6%404ax.com
struct X
{
};
void g(X&);
void f()
{
X() = X();
g(X() = X());
g(X()); // No good
}
Note that above, the result of assigning one rvalue to another rvalue
is a modifiable lvalue. :)
*****
The difference between the rvalues produced by X() and int() is that the
former has member functions you can call on it, and you're allowed to call
them, including the assignment operator, which by default returns a
reference to the object assigned.

Signature
Doug Harrison
VC++ MVP
Tom Widmer [VC++ MVP] - 23 Sep 2005 16:41 GMT
>>void f(int& i)
>>{
[quoted text clipped - 9 lines]
> like this, tsk, tsk, naughty compiler... Pascal doesn't allow this! Does C#?
> I hope not :-))
Well, VC++ does at least give a diagnostic to indicate that the code has
an error - the code is "ill-formed" C++, and VC++ is reporting that fact.
> But, that's not my situation. I have X as a "polymorphic worker class", and
> it may or not change inside X, I don't care. I just want to it passed to F
[quoted text clipped - 6 lines]
> and then F(BaseX&) gets called like this: F(X1(params)), F(X2(params)),
> F(X3(params)) etc...
Perhaps F should take a const reference and f() should be a const
member? Alternatively, there is this workaround that must be used with care:
template <class T>
inline T& ref_from_temp(T const& t)
{
return const_cast<T&>(t);
}
F(ref_from_temp(X1(params)));
Tom