Connecting Tech Pros Worldwide Forums | Help | Site Map

Initialisation of reference vs. initialisation of reference member

Tim Clacy
Guest
 
Posts: n/a
#1: May 30 '06
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
Guest
 
Posts: n/a
#2: May 30 '06

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...[color=blue]
> 1) Is this initialising the reference 'u' to the address of the literal
> '2' or to the address 0x00000002?
>
> unsigned const& u = 2;[/color]

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
Guest
 
Posts: n/a
#3: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


Jim Langston wrote:[color=blue]
> "Tim Clacy" <nospamtcl@nospamphaseone.nospamdk> wrote in message
> news:447bf6f8$0$38638$edfadb0f@dread12.news.tele.d k...[color=green]
>> 1) Is this initialising the reference 'u' to the address of the
>> literal '2' or to the address 0x00000002?
>>
>> unsigned const& u = 2;[/color]
>
> 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.[/color]

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
Guest
 
Posts: n/a
#4: May 30 '06

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
Guest
 
Posts: n/a
#5: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


shailesh wrote:[color=blue]
> 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.[/color]

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
Guest
 
Posts: n/a
#6: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


"shailesh" <shaileshk@gmail.com> wrote in message
news:1148984147.251246.260650@j33g2000cwa.googlegr oups.com[color=blue]
>
> 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.[/color]

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

--
John Carson


Tim Clacy
Guest
 
Posts: n/a
#7: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


John Carson wrote:[color=blue]
> "shailesh" <shaileshk@gmail.com> wrote in message
> news:1148984147.251246.260650@j33g2000cwa.googlegr oups.com[color=green]
>>
>> 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.[/color]
>
> On the other hand, Comeau online compiles the code without complaint.[/color]

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


Tomás
Guest
 
Posts: n/a
#8: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


Tim Clacy posted:
[color=blue]
> 1) Is this initialising the reference 'u' to the address of the
> literal '2' or to the address 0x00000002?
>
> unsigned const& u = 2;[/color]


C++ handles this under the hood as:


unsigned const literal_2 = 2;

unsigned const &u = literal_2;


[color=blue]
> 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;[/color]


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

unsigned const u = 2;


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


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


When in doubt, presume Microsoft's incompetence.


-Tomás
Tim Clacy
Guest
 
Posts: n/a
#9: May 30 '06

re: Initialisation of reference vs. initialisation of reference member


Tomás wrote:[color=blue]
> Tim Clacy posted:
>[color=green]
>> 1) Is this initialising the reference 'u' to the address of the
>> literal '2' or to the address 0x00000002?
>>
>> unsigned const& u = 2;[/color]
>
>
> C++ handles this under the hood as:
>
>
> unsigned const literal_2 = 2;
>
> unsigned const &u = literal_2;
>
>
>[color=green]
>> 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;[/color]
>
>
> No difference. However, the global variable is far more likely to
> simply be optimized to:
>
> unsigned const u = 2;
>
>
>[color=green]
>> VisualStudio 2005 generates "error C2354: 'S::u' : initialization of
>> reference member requires a temporary variable" but does not complain
>> about the initialisation of 'u'.[/color]
>
>
> The code compiles without error and without warning with the G++
> compiler.
>
>
> When in doubt, presume Microsoft's incompetence.
>
>
> -Tomás[/color]

Thanks very much Tomás


Closed Thread


Similar C / C++ bytes