Re: Rvalue-references, binding and conversions
Dragan Milenkovic <dragan@plusplus.rs> writes:
Tested with latest GCC. I made an assumption that they did it right.
Here it is...
struct Foo {
Foo(const Foo &);
};
struct Bar {
Bar(const Foo &);
};
const Foo && func();
int main() {
Foo && foo = func(); // #1 fails
Bar && bar = func(); // #2 succeeds
}
#1 fails because we cannot bind a const rvalue to non-const reference.
#2 succeeds by creating a temporary of type Bar.
Yes.
From the compiler's (technical) point of view, I understand...
#1 has different const-ness so it fails. #2 has different types so
it looks for a conversion, creates a temporary, which can be
bound to a rvalue-reference.
But from my own point of view, #1 and #2 are different only in the
resulting type they want to capture. I would like them both to either
succeed or fail. I'm guessing if templates were in the game,
it would create even more confusion for the developer.
Lvalue-reference don't have this kind of problem.
So, for this to equal, we need:
Foo && foo = Foo(func());
Bar && bar = func();
Why not make a temporary in #1 also?
It prefers to convert to another type, but not to its own?!?
That's the same way things have always worked in C++: you get similar
behaviour with normal lvalue references:
const Foo& func();
Foo& foo=func(); // fails
Bar const& bar=func(); // succeeds, binds reference to temporary.
The compiler will not generate a temporary or perform a conversion to
bind a value of type T to a reference to that type. If the
const-volatile qualification doesn't match, it won't bind.
Anthony
--
Anthony Williams
Author of C++ Concurrency in Action | http://www.manning.com/williams
Custom Software Development | http://www.justsoftwaresolutions.co.uk
Just Software Solutions Ltd, Registered in England, Company Number 5478976.
Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]