Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #11641

Re: Mutability of temporary variables

From "Paul" <pchrist<nospam>or@yahoo.co.uk>
Newsgroups comp.lang.c++
Subject Re: Mutability of temporary variables
Date 2011-11-20 16:51 +0000
Organization Netfront http://www.netfront.net/
Message-ID <jabb66$319i$1@adenine.netfront.net> (permalink)
References (5 earlier) <9vidndGK4sk50FXTnZ2dnUVZ8nadnZ2d@giganews.com> <S8qdnejZWYEMyVXTnZ2dnUVZ8hadnZ2d@giganews.com> <ja9ovj$197t$1@adenine.netfront.net> <Zt-dnYjTWOLxZlXTnZ2dnUVZ7o2dnZ2d@giganews.com> <l6Odnf_e2fxnY1XTnZ2dnUVZ7s2dnZ2d@giganews.com>

Show all headers | View raw


"Leigh Johnston" <leigh@i42.co.uk> wrote in message 
news:l6Odnf_e2fxnY1XTnZ2dnUVZ7s2dnZ2d@giganews.com...
> On 20/11/2011 13:06, Leigh Johnston wrote:
>> On 20/11/2011 02:34, Paul <pchrist wrote:
>>> "Leigh Johnston"<leigh@i42.co.uk> wrote in message
>>> news:S8qdnejZWYEMyVXTnZ2dnUVZ8hadnZ2d@giganews.com...
>>>> On 20/11/2011 00:45, Leigh Johnston wrote:
>>>>> On 20/11/2011 00:14, Paul<pchrist wrote:
>>>>>> "Leigh Johnston"<leigh@i42.co.uk> wrote in message
>>>>>> news:Do2dnVH-ff_DIVrTnZ2dnUVZ8qOdnZ2d@giganews.com...
>>>>>>> On 19/11/2011 13:45, Victor Bazarov wrote:
>>>>>>>> On 11/19/2011 8:18 AM, Paavo Helde wrote:
>>>>>>>>> kyle<kyle@nomail.com> wrote in
>>>>>>>>> news:op.v4605gilpbcp0d@localhost.localdomain:
>>>>>>>>>
>>>>>>>>>> Consider following code:
>>>>>>>>>>
>>>>>>>>>> int main() {
>>>>>>>>>> const int& c = int();
>>>>>>>>>> int& m = const_cast<int&>(c);
>>>>>>>>>> m = 4;
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> The object of the snippet is to get a mutable reference to a
>>>>>>>>>> temporary. This cant be done directly because non-const reference
>>>>>>>>>> cannot bind to temporary, but we should be OK with casting away
>>>>>>>>>> constness of reference 'c' since it doesn't actually refer to
>>>>>>>>>> const
>>>>>>>>>> object.
>>>>>>>>>>
>>>>>>>>>> Temporaries are mutable, so in whole my snippet is legal C++. Am 
>>>>>>>>>> i
>>>>>>>>>> correct?
>>>>>>>>>
>>>>>>>>> Yes, I think you are correct. Another trick to get a mutable
>>>>>>>>> reference
>>>>>>>>> to
>>>>>>>>> a temporary is to use a non-const member function. This avoids
>>>>>>>>> const_cast, but of course lifetime extending by binding to a const
>>>>>>>>> reference does not work any more:
>>>>>>>>>
>>>>>>>>> struct A {
>>>>>>>>> int m;
>>>>>>>>> A& Ref() {return *this;}
>>>>>>>>> };
>>>>>>>>>
>>>>>>>>> void f(A& a) {
>>>>>>>>> a.m = 4;
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> int main() {
>>>>>>>>> f( A().Ref() );
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>
>>>>>>>> There is a difference between your example and the OP's. In your
>>>>>>>> example
>>>>>>>> the temporary is of a class type, and the expression A() produces 
>>>>>>>> an
>>>>>>>> lvalue to begin with.
>>>>>>>
>>>>>>> No; A() produces an rvalue.
>>>>>>>
>>>>>> Um no , the value produced is neither an l-value or an r-value , its
>>>>>> inbetween and its known as an intermediate-value.
>>>>>> Its value is neither left nor right because its not actually a value
>>>>>> at all.
>>>>>> Its an abstractatin of the representented data, which was never
>>>>>> actually
>>>>>> data in the first place because it was just an identifier which
>>>>>> "pointed to"
>>>>>> the data or "represnted" said data or datas.
>>>>>> But the identifier was not even an identifier because it was a "name"
>>>>>> which
>>>>>> represents an identifier which , in turn , represents data.
>>>>>>
>>>>>> Get a grip noob.
>>>>>
>>>>> #include<iostream>
>>>>>
>>>>> struct foo
>>>>> {
>>>>> };
>>>>>
>>>>> void what_am_i(const foo&)
>>>>> {
>>>>> std::cout<< "I seem to be an lvalue\n";
>>>>> }
>>>>>
>>>>> void what_am_i(const foo&&)
>>>>> {
>>>>> std::cout<< "I seem to be an rvalue\n";
>>>>> }
>>>>>
>>>>> int main()
>>>>> {
>>>>> foo f;
>>>>> what_am_i(f);
>>>>> what_am_i(foo());
>>>>> }
>>>>>
>>>>> Outputs:
>>>>>
>>>>> I seem to be an lvalue
>>>>> I seem to be an rvalue
>>>>>
>>>>> Go figure, "noob".
>>>>
>>>> Or to put it another way:
>>>>
>>>> #include<iostream>
>>>>
>>>> struct foo
>>>> {
>>>> };
>>>>
>>>> void what_does_gplusplus_call_me(foo&)
>>>> {
>>>> std::cout<< "I seem to be an lvalue\n";
>>>
>>> Are you suggesting a string literal is an l-value?
>>
>> No; a string literal is an rvalue. The function
>> what_does_gplusplus_call_me can only accept an lvalue as an argument
>> (hence the std::cout statement) as a non-const lvalue reference will not
>> bind to an rvalue hence the explanatory compiler error below.
>
> Actually I am mistaken; a string literal is an lvalue.
>
You don't seem very sure about this.



--- Posted via news://freenews.netfront.net/ - Complaints to news@netfront.net ---

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Mutability of temporary variables kyle <kyle@nomail.com> - 2011-11-19 13:33 +0100
  Re: Mutability of temporary variables Paavo Helde <myfirstname@osa.pri.ee> - 2011-11-19 07:18 -0600
    Re: Mutability of temporary variables Victor Bazarov <v.bazarov@comcast.invalid> - 2011-11-19 08:45 -0500
      Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-19 14:25 +0000
        Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 00:14 +0000
          Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-20 00:45 +0000
            Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-20 01:14 +0000
              Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 02:34 +0000
                Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 02:44 +0000
                Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-20 13:06 +0000
                Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-20 13:21 +0000
                Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 16:51 +0000
                Re: Mutability of temporary variables Leigh Johnston <leigh@i42.co.uk> - 2011-11-20 17:24 +0000
      Re: Mutability of temporary variables SG <s.gesemann@gmail.com> - 2011-11-20 00:49 -0800
  Re: Mutability of temporary variables Victor Bazarov <v.bazarov@comcast.invalid> - 2011-11-19 08:42 -0500
    Re: Mutability of temporary variables Paavo Helde <myfirstname@osa.pri.ee> - 2011-11-19 08:20 -0600
      Re: Mutability of temporary variables Victor Bazarov <v.bazarov@comcast.invalid> - 2011-11-19 15:51 -0500
        Re: Mutability of temporary variables Paavo Helde <myfirstname@osa.pri.ee> - 2011-11-19 16:51 -0600
        Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 00:23 +0000
  Re: Mutability of temporary variables Johannes Schaub <schaub.johannes@googlemail.com> - 2011-11-19 16:16 +0100
    Re: Mutability of temporary variables "Paul" <pchrist<nospam>or@yahoo.co.uk> - 2011-11-20 00:31 +0000
    Re: Mutability of temporary variables kyle <kyle@nomail.com> - 2011-11-24 00:50 +0100
      Re: Mutability of temporary variables Johannes Schaub <schaub.johannes@googlemail.com> - 2011-11-24 20:36 +0100
  Re: Mutability of temporary variables SG <s.gesemann@gmail.com> - 2011-11-21 01:17 -0800
    Re: Mutability of temporary variables Johannes Schaub <schaub.johannes@googlemail.com> - 2011-11-22 23:26 +0100

csiph-web