Re: Is these 2 legal?
On 4 mar, 12:27, SG <s.gesem...@gmail.com> wrote:
On 4 Mrz., 10:21, Michael Tsang <mikl...@gmail.com> wrote:
[subject: Is this legal?]
There is a difference between the old rvalue references and the new
ones. GCC and MSVC still implement the old behaviour. But rvalue
references cannot be initialized with lvalue expressions anymore
according to the new rules.
Check out:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2812.h=
tmlhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html
I'm applying the new rules in this post.
Example 1:
int main() {
int x = 5;
int &&y = x;
}
No. It won't comile because x is an lvalue expression.
From =A75/6 of n3035, AFAIS y will decay to the semantic equivalent of a
lvalue:
<quote>
[ Example:
struct A { };
A&& operator+(A, A);
A&& f();
A a;
A&& ar = a;
The expressions f() and a + a are rvalues of type A. The expression ar
is an lvalue of type A. =97end
example ]
</quote>
Example 2:
int &&move(int &&x) {
return x;
}
No. It won't compile because x is a *named* rvalue reference which
makes it an lvalue expression. Basically, names (that refer to
objects) and lvalue references are lvalue expressions. Anything else
is an rvalue expression. Try this:
int&& move(int& x) {
return static_cast<int&&>(x);
}
You can cast away "lvalue-ness" with a static cast. std::move is a
shortcut syntax for a static_cast.
The generic move is:
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
Replacing T by int (and remove_reference<int>::type ), you get the
same implementation as the OP.
int main() {
int x = 5;
int &&y = move(x);
}
This is OK. move returns an unnamed rvalue reference. So, it neither
has a name, nor is an lvalue reference. This makes it an rvalue
expression and you can initialize the rvalue reference y with this
rvalue expression.
Either I am confused or you are working with an earlier rvalue-
reference proposal.
--
Michael