About const reference bounding to temporary variables.

Discussion in 'C++' started by =?utf-8?B?5YiY5piK?=, Aug 13, 2007.

  1. Hi, folks,
    Look at the following snippet:

    int main()
    {
    double temp = 2.0;
    const double& r = 2.0 + temp; // without const, an err will be
    raised

    return 0;
    }

    As the comment block illustrated, without "const" qualifier

    error: could not convert `(temp + 2.0e+0)' to `double&'

    will be raised, I know, you can't use an expression to initialize a
    reference, but why it's OK with const qualifier? Thanks, you guys.
    =?utf-8?B?5YiY5piK?=, Aug 13, 2007
    #1
    1. Advertising

  2. 刘昊 wrote:
    > Hi, folks,
    > Look at the following snippet:
    >
    > int main()
    > {
    > double temp = 2.0;
    > const double& r = 2.0 + temp; // without const, an err will be
    > raised
    >
    > return 0;
    > }
    >
    > As the comment block illustrated, without "const" qualifier
    >
    > error: could not convert `(temp + 2.0e+0)' to `double&'
    >
    > will be raised, I know, you can't use an expression to initialize a
    > reference, but why it's OK with const qualifier? Thanks, you guys.


    The answer is ... because the C++ specification says so.

    I think it is because it conforms to the "path of least surprise" rule.
    It makes little sense to modify the result of an expression (a
    temporary). There are other probably better reasons...
    Gianni Mariani, Aug 13, 2007
    #2
    1. Advertising

  3. =?utf-8?B?5YiY5piK?=

    Guest Guest

    Thank you, GM,

    I think I've figured out what's going on here.

    ....
    double& r = 2.0+temp;
    ....

    The compiler generates a temporary variable we can not see to
    initialize the reference, it makes no sense to let an expression be a
    L value, so the compiler enforces this by raising an error if we
    remove the "const" qualifier before the reference.
    Guest, Aug 13, 2007
    #3
  4. =?utf-8?B?5YiY5piK?=

    Kai-Uwe Bux Guest

    Gianni Mariani wrote:

    > ?? wrote:
    >> Hi, folks,
    >> Look at the following snippet:
    >>
    >> int main()
    >> {
    >> double temp = 2.0;
    >> const double& r = 2.0 + temp; // without const, an err will be
    >> raised
    >>
    >> return 0;
    >> }
    >>
    >> As the comment block illustrated, without "const" qualifier
    >>
    >> error: could not convert `(temp + 2.0e+0)' to `double&'
    >>
    >> will be raised, I know, you can't use an expression to initialize a
    >> reference, but why it's OK with const qualifier? Thanks, you guys.

    >
    > The answer is ... because the C++ specification says so.
    >
    > I think it is because it conforms to the "path of least surprise" rule.
    > It makes little sense to modify the result of an expression (a
    > temporary).


    If that was the reason, the standard could just say that temporaries are
    const. However, it is perfectly legal to modify temporaries: you can call
    non-const member functions on temporaries.

    In fact, you can use this to circumvent the language restriction on binding
    a temporary to a non-const reference:

    struct I_can_bind {


    I_can_bind & me ( void ) {
    return ( *this );
    }

    };

    void some_fct ( I_can_bind & ref ) {}

    some_fct( I_can_bind().me() );


    > There are other probably better reasons...


    One thing is automatic conversions. Consider:


    void inc ( double & d ) {
    d += 1.0;
    }
    ...
    int i = 5;
    ...
    inc( i );


    In this case, a temporary double would be constructed from i and then the
    temporary would be incremented instead of i.


    Best

    Kai-Uwe Bux
    Kai-Uwe Bux, Aug 13, 2007
    #4
  5. =?utf-8?B?5YiY5piK?=

    Guest Guest

    First, thank you, KUB,

    > One thing is automatic conversions. Consider:
    >
    > void inc ( double & d ) {
    > d += 1.0;
    > }
    > ...
    > int i = 5;
    > ...
    > inc( i );
    >
    > In this case, a temporary double would be constructed from i and then the
    > temporary would be incremented instead of i.

    Have you tried on your compiler(s)? I've tried both on g++ and cl,
    none of them will get through without error, they both complained that
    you can not convert an int to double&.
    Guest, Aug 13, 2007
    #5
  6. =?utf-8?B?5YiY5piK?=

    Kai-Uwe Bux Guest

    wrote:

    > First, thank you, KUB,
    >
    >> One thing is automatic conversions. Consider:
    >>
    >> void inc ( double & d ) {
    >> d += 1.0;
    >> }
    >> ...
    >> int i = 5;
    >> ...
    >> inc( i );
    >>
    >> In this case, a temporary double would be constructed from i and then the
    >> temporary would be incremented instead of i.

    > Have you tried on your compiler(s)? I've tried both on g++ and cl,
    > none of them will get through without error, they both complained that
    > you can not convert an int to double&.


    May I remind you that we are discussing the rational for C++ not allowing to
    initialize a non-const reference from a temporary. The code above _would_
    compile in C++ if that provision want not in the standard. See the
    following (compiles)

    void inc ( double const & d ) {
    // d += 1.0;
    }

    int main ( void ) {
    int i = 5;
    inc( i );
    }

    versus (does not compile)

    void inc ( double & d ) {
    d += 1.0;
    }

    int main ( void ) {
    int i = 5;
    inc( i );
    }

    People wanted the later to not compile and that is one of the reasons that
    C++ prohibits binding temporaries to non-const variables.


    Best

    Kai-Uwe Bux
    Kai-Uwe Bux, Aug 13, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?ISO-8859-1?Q?Ney_Andr=E9_de_Mello_Zunion?=

    The temporary vs non-const reference love story

    =?ISO-8859-1?Q?Ney_Andr=E9_de_Mello_Zunion?=, Nov 4, 2003, in forum: C++
    Replies:
    13
    Views:
    569
    Ron Natalie
    Nov 6, 2003
  2. John Ky
    Replies:
    9
    Views:
    425
    John Ky
    Feb 23, 2004
  3. qazmlp
    Replies:
    4
    Views:
    1,370
    Buster
    May 6, 2004
  4. Javier
    Replies:
    2
    Views:
    542
    James Kanze
    Sep 4, 2007
  5. George2
    Replies:
    10
    Views:
    576
    Pete Becker
    Dec 17, 2007
Loading...

Share This Page