Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Initialisation of reference vs. initialisation of reference member (http://www.velocityreviews.com/forums/t454400-initialisation-of-reference-vs-initialisation-of-reference-member.html)

Tim Clacy 05-30-2006 07:40 AM

Initialisation of reference vs. initialisation of reference member
 
1) Is this initialising the reference 'u' to the address of the literal '2'
or to the address 0x00000002?

unsigned const& u = 2;


2) What is the different between the initialisation of 'u' and 'S::u' below?

unsigned const& u = 2;

struct S
{
unsigned const& u;

S() : u (2) { }

} s;

int main(int argc, char* argv[])
{
return 0;
}


VisualStudio 2005 generates "error C2354: 'S::u' : initialization of
reference member requires a temporary variable" but does not complain about
the initialisation of 'u'. A couple of other compilers that I have say
nothing about either (GCC 3.3.4, ADS 1.2).


Any illumination will be greatly appreciated.


Tim



Jim Langston 05-30-2006 08:36 AM

Re: Initialisation of reference vs. initialisation of reference member
 

"Tim Clacy" <nospamtcl@nospamphaseone.nospamdk> wrote in message
news:447bf6f8$0$38638$edfadb0f@dread12.news.tele.d k...
> 1) Is this initialising the reference 'u' to the address of the literal
> '2' or to the address 0x00000002?
>
> unsigned const& u = 2;


Easy enough to find out:
std::cout << u;
outputs
2
so it would initializing the reference to be the address where the constant
unsigned int is stored.



Tim Clacy 05-30-2006 09:53 AM

Re: Initialisation of reference vs. initialisation of reference member
 
Jim Langston wrote:
> "Tim Clacy" <nospamtcl@nospamphaseone.nospamdk> wrote in message
> news:447bf6f8$0$38638$edfadb0f@dread12.news.tele.d k...
>> 1) Is this initialising the reference 'u' to the address of the
>> literal '2' or to the address 0x00000002?
>>
>> unsigned const& u = 2;

>
> Easy enough to find out:
> std::cout << u;
> outputs
> 2
> so it would initializing the reference to be the address where the
> constant unsigned int is stored.


Hi Jim,

Thanks for replying. I think all you code proves is that the value of u is
2; it doesn't really prove that this is because the reference has been
initialised to the address of a literal 2 or because a word access to
address 2 returns 2.



shailesh 05-30-2006 10:15 AM

Re: Initialisation of reference vs. initialisation of reference member
 
I tried running this:

unsigned const int& n = 3;
cout << n << endl;
cout << &n << endl;

Output is:
3
0012FEC8

During debugging I can see that memory location 0012FEC8 has the value
3 stored.

This is on VC++ 2003 compiler.

So this answers question 1.

2:

About the error you saw, MSDN says this:
'reference' : initialization of reference member requires a temporary
variable

A constructor initializes a reference to a member instead of
initializing the member.

It is invalid to initialize a reference member of a class in the
class's constructor with a temporary variable. An attempt to do so
generates the C2354 error, as illustrated by this sample code:

// C2354.cpp
int temp() { return 1; }
class Test
{
public:
int member;
int& ref_member;
Test();
};

Test::Test() : ref_member( temp() )
{ // C2354
}
When this error is encountered, the solution is to change the code so
that the reference member is not initialized to a temporary variable.
The reference must be initialized to an object that will exist for the
lifetime of the reference member.
------------------------------------------------------------------------------------

So it seems that the 2 in the constructor call is being treated as a
temporary variable. and not as something in the global memory.


Tim Clacy 05-30-2006 01:01 PM

Re: Initialisation of reference vs. initialisation of reference member
 
shailesh wrote:
> I tried running this:
>
> unsigned const int& n = 3;
> cout << n << endl;
> cout << &n << endl;
>
> Output is:
> 3
> 0012FEC8
>
> During debugging I can see that memory location 0012FEC8 has the value
> 3 stored.
>
> This is on VC++ 2003 compiler.
>
> So this answers question 1.
>
> 2:
>
> About the error you saw, MSDN says this:
> 'reference' : initialization of reference member requires a temporary
> variable
>
> A constructor initializes a reference to a member instead of
> initializing the member.
>
> It is invalid to initialize a reference member of a class in the
> class's constructor with a temporary variable. An attempt to do so
> generates the C2354 error, as illustrated by this sample code:
>
> // C2354.cpp
> int temp() { return 1; }
> class Test
> {
> public:
> int member;
> int& ref_member;
> Test();
> };
>
> Test::Test() : ref_member( temp() )
> { // C2354
> }
> When this error is encountered, the solution is to change the code so
> that the reference member is not initialized to a temporary variable.
> The reference must be initialized to an object that will exist for the
> lifetime of the reference member.
> ------------------------------------------------------------------------------------
>
> So it seems that the 2 in the constructor call is being treated as a
> temporary variable. and not as something in the global memory.


Hi shailesh,

That's very interesting but the Microsoft compiler error that I saw was '
initialization of
reference member requires a temporary variable'. This is quite the opposite
of what the MSDN article says (reference member must NOT be initialised to a
temporary).

I'm a little more confused now :-(



John Carson 05-30-2006 01:09 PM

Re: Initialisation of reference vs. initialisation of reference member
 
"shailesh" <shaileshk@gmail.com> wrote in message
news:1148984147.251246.260650@j33g2000cwa.googlegr oups.com
>
> 2:
>
> About the error you saw, MSDN says this:
> 'reference' : initialization of reference member requires a temporary
> variable
>
> A constructor initializes a reference to a member instead of
> initializing the member.
>
> It is invalid to initialize a reference member of a class in the
> class's constructor with a temporary variable. An attempt to do so
> generates the C2354 error, as illustrated by this sample code:
>
> // C2354.cpp
> int temp() { return 1; }
> class Test
> {
> public:
> int member;
> int& ref_member;
> Test();
> };
>
> Test::Test() : ref_member( temp() )
> { // C2354
> }
> When this error is encountered, the solution is to change the code so
> that the reference member is not initialized to a temporary variable.
> The reference must be initialized to an object that will exist for the
> lifetime of the reference member.
> ------------------------------------------------------------------------------------
>
> So it seems that the 2 in the constructor call is being treated as a
> temporary variable. and not as something in the global memory.


On the other hand, Comeau online compiles the code without complaint.

--
John Carson



Tim Clacy 05-30-2006 01:20 PM

Re: Initialisation of reference vs. initialisation of reference member
 
John Carson wrote:
> "shailesh" <shaileshk@gmail.com> wrote in message
> news:1148984147.251246.260650@j33g2000cwa.googlegr oups.com
>>
>> 2:
>>
>> About the error you saw, MSDN says this:
>> 'reference' : initialization of reference member requires a temporary
>> variable
>>
>> A constructor initializes a reference to a member instead of
>> initializing the member.
>>
>> It is invalid to initialize a reference member of a class in the
>> class's constructor with a temporary variable. An attempt to do so
>> generates the C2354 error, as illustrated by this sample code:
>>
>> // C2354.cpp
>> int temp() { return 1; }
>> class Test
>> {
>> public:
>> int member;
>> int& ref_member;
>> Test();
>> };
>>
>> Test::Test() : ref_member( temp() )
>> { // C2354
>> }
>> When this error is encountered, the solution is to change the code so
>> that the reference member is not initialized to a temporary variable.
>> The reference must be initialized to an object that will exist for
>> the lifetime of the reference member.
>> ------------------------------------------------------------------------------------
>>
>> So it seems that the 2 in the constructor call is being treated as a
>> temporary variable. and not as something in the global memory.

>
> On the other hand, Comeau online compiles the code without complaint.


Hi John, so does GCC 3.3.4 for ARM and it behaves as expected at run-time
too.



Tomás 05-30-2006 04:23 PM

Re: Initialisation of reference vs. initialisation of reference member
 
Tim Clacy posted:

> 1) Is this initialising the reference 'u' to the address of the
> literal '2' or to the address 0x00000002?
>
> unsigned const& u = 2;



C++ handles this under the hood as:


unsigned const literal_2 = 2;

unsigned const &u = literal_2;



> 2) What is the different between the initialisation of 'u' and 'S::u'
> below?
>
> unsigned const& u = 2;
>
> struct S
> {
> unsigned const& u;
>
> S() : u (2) { }
>
> } s;



No difference. However, the global variable is far more likely to simply
be optimized to:

unsigned const u = 2;



> VisualStudio 2005 generates "error C2354: 'S::u' : initialization of
> reference member requires a temporary variable" but does not complain
> about the initialisation of 'u'.



The code compiles without error and without warning with the G++
compiler.


When in doubt, presume Microsoft's incompetence.


-Tomás

Tim Clacy 05-30-2006 06:14 PM

Re: Initialisation of reference vs. initialisation of reference member
 
Tomás wrote:
> Tim Clacy posted:
>
>> 1) Is this initialising the reference 'u' to the address of the
>> literal '2' or to the address 0x00000002?
>>
>> unsigned const& u = 2;

>
>
> C++ handles this under the hood as:
>
>
> unsigned const literal_2 = 2;
>
> unsigned const &u = literal_2;
>
>
>
>> 2) What is the different between the initialisation of 'u' and 'S::u'
>> below?
>>
>> unsigned const& u = 2;
>>
>> struct S
>> {
>> unsigned const& u;
>>
>> S() : u (2) { }
>>
>> } s;

>
>
> No difference. However, the global variable is far more likely to
> simply be optimized to:
>
> unsigned const u = 2;
>
>
>
>> VisualStudio 2005 generates "error C2354: 'S::u' : initialization of
>> reference member requires a temporary variable" but does not complain
>> about the initialisation of 'u'.

>
>
> The code compiles without error and without warning with the G++
> compiler.
>
>
> When in doubt, presume Microsoft's incompetence.
>
>
> -Tomás


Thanks very much Tomás




All times are GMT. The time now is 12:42 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.