Topic: C++0x, N2960, rvalue reference issues


Author: SG <s.gesemann@gmail.com>
Date: Sun, 15 Nov 2009 19:04:51 CST
Raw View
On 12 Nov., 19:58, Johannes Schaub (litb) wrote:
> SG wrote:
> > It seems there are still some places in N2960 where the term "rvalue"
> > is used without having accounted for rvalue references:

[...]

> This is http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#690

[...]

> This is http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#964

Thanks for pointing out the CWG issues. So, 2 out of 4 are already CWG
issues.

It seems N3010 covers a lot of what I was trying to say:
"Rvalue References as Funny Lvalues" by William M. Miller
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n3010.pdf

The only difference is that the author splits "lvalue" into two
subcategories (rref lvalue and non-rref lvalue) where I informally
proposed splitting "rvalue" into two subcategories "direct rvalue" and
"indirect rvalue". But in the end that leaves three equivalent
categories:

   me              | William M. Miller
   ----------------+------------------
   direct rvalue   | rvalue
   indirect rvalue | rref lvalue
   lvalue          | non-rref lvalue

I guess both namings are initially somewhat confusing. To be honest, I
find a category named "non-rref lvalue" that includes
_named_rvalue_references_ unfortunate. But William M. Miller and I
seem to agree that instead of two categories (lvalue, rvalue) the use
of three categories is appropriate and avoids some special cases in
the rules.

Cheers,
SG

--
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@netlab.cs.rpi.edu]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]





Author: SG <s.gesemann@gmail.com>
Date: Thu, 12 Nov 2009 11:24:40 CST
Raw View
It seems there are still some places in N2960 where the term "rvalue"
is used without having accounted for rvalue references:


"1.3.4.: The dynamic type [...] [Example: if a pointer p whose static
type is "pointer to class B is pointing to an object of class D,
derived from B, the dynamic type of the expression *p is D. References
are treated similarly. -- end example] The dynamic type of an rvalue
expression is its static type."

So, what's it gonna be? An unnamed rvalue reference is both a
reference and an rvalue expression.


"3.10/2: An lvalue refers to an object or function. Some rvalue
expressions -- those of class or cv-qualified class type -- also refer
to objects."

Doesn't an unnamed rvalue *reference* of type int&& also *refer* to an
object?


"3.10/7: Whenever an lvalue appears in a context where an rvalue
expression is expected, the lvalue is converted to an rvalue."

What are these "contexts"? I would think that "int&& foo = ...;" isn't
one of them, although it is a context where an rvalue expression is
needed according to the not-so-new-anymore reference binding rules.


"3.10/9: [...] Rvalues shall always have complete types or the void
type; in addition to these types, lvalues can also have incomplete
types."

Hmmm... Since "every expression is either an rvalue or an
lvalue" (3.10/1) the above line seems to suggest that there cannot be
unnamed rvalue reference T&& where T is an incomplete type. I don't
think that this is intended.


The overall problem seems to be that we have only two terms --
"lvalue" and "rvalue" -- but actually *three* different kinds of
expressions as far as the rules are concerned:
   1. "direct" rvalue expression (no reference)
   2. "indirect" rvalue expression (unnamed rvalue reference)
   3. lvalue expression

Sometimes "rvalue" is used to denote expressions of class 1 and 2. In
other situations "rvalue" is used to denote expressions of class 1
only.


Cheers,
SG

--
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@netlab.cs.rpi.edu]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]





Author: "Johannes Schaub (litb)" <schaub-johannes@web.de>
Date: Thu, 12 Nov 2009 12:58:35 CST
Raw View
SG wrote:

> It seems there are still some places in N2960 where the term "rvalue"
> is used without having accounted for rvalue references:
>
>
> "1.3.4.: The dynamic type [...] [Example: if a pointer p whose static
> type is "pointer to class B is pointing to an object of class D,
> derived from B, the dynamic type of the expression *p is D. References
> are treated similarly. -- end example] The dynamic type of an rvalue
> expression is its static type."
>
> So, what's it gonna be? An unnamed rvalue reference is both a
> reference and an rvalue expression.
>
>
This is http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#690


> "3.10/7: Whenever an lvalue appears in a context where an rvalue
> expression is expected, the lvalue is converted to an rvalue."
>
> What are these "contexts"? I would think that "int&& foo = ...;" isn't
> one of them, although it is a context where an rvalue expression is
> needed according to the not-so-new-anymore reference binding rules.
>
This is http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#964


--
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@netlab.cs.rpi.edu]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]