Boost logo

Boost :

Subject: Re: [boost] [optional] little addition... optional_assign_to, optional_move_to, optional_swap?
From: Niels Dekker - mail address until 2010-10-10 (niels_address_until_2010-10-10_at_[hidden])
Date: 2009-03-07 09:10:22


>> Would you like to officially create a request ticket
>> for those three member functions...

Arno Schödl wrote:
> Done.

Ah, I see: https://svn.boost.org/trac/boost/ticket/2836 Thanks! BTW,
if Fernando wants to do the job, I'll reassign the ticket to him, of
course. Otherwise I wouldn't mind doing the job.

> Thank you for educating me! Just for overview:
>
> struct S;
>
> void change( S& s ) {}
>
> struct S {
> bool m_b;
> void func() {
> change( *this );
> }
> };
>
> change( S() ); // does not compile
> S().func(); // compiles

> S().m_b=true; // does not compile (!)

Right! A data member of an rvalue is itself an rvalue, and you cannot
assign to an rvalue, if it's of a built-in type.

> I found this interesting:

  [From here I guess you did #define T S]

> struct T;
>
> void change( T& s ) {}
>
> struct T {
> // makes R-values non-const
> operator S&() {
> return *this;
> }
> };

> change( S() ); // compiles

It does not compile at www.comeaucomputing.com/tryitout as it tells me:

"ComeauTest.c", line 9: warning: "S::operator S &()" will not be called
for implicit or explicit conversions
       operator S&() {
       ^
"ComeauTest.c", line 15: error: initial value of reference to non-const
must be an lvalue
   change( S() ); // compiles
           ^

So I assume you're experiencing a compiler specific "feature". ;-)

   Kind regards, Niels


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk