Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Initialisation of reference vs. initialisation of reference member

Reply
Thread Tools

Initialisation of reference vs. initialisation of reference member

 
 
Tim Clacy
Guest
Posts: n/a
 
      05-30-2006
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


 
Reply With Quote
 
 
 
 
Jim Langston
Guest
Posts: n/a
 
      05-30-2006

"Tim Clacy" <(E-Mail Removed)> wrote in message
news:447bf6f8$0$38638$(E-Mail Removed) 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.


 
Reply With Quote
 
 
 
 
Tim Clacy
Guest
Posts: n/a
 
      05-30-2006
Jim Langston wrote:
> "Tim Clacy" <(E-Mail Removed)> wrote in message
> news:447bf6f8$0$38638$(E-Mail Removed) 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.


 
Reply With Quote
 
shailesh
Guest
Posts: n/a
 
      05-30-2006
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.

 
Reply With Quote
 
Tim Clacy
Guest
Posts: n/a
 
      05-30-2006
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


 
Reply With Quote
 
John Carson
Guest
Posts: n/a
 
      05-30-2006
"shailesh" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) 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


 
Reply With Quote
 
Tim Clacy
Guest
Posts: n/a
 
      05-30-2006
John Carson wrote:
> "shailesh" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed) 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.


 
Reply With Quote
 
Tomás
Guest
Posts: n/a
 
      05-30-2006
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
 
Reply With Quote
 
Tim Clacy
Guest
Posts: n/a
 
      05-30-2006
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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
member const initialisation santosh C++ 3 05-23-2005 03:09 PM
How would I use qsort to sort a struct with a char* member and a long member - I want to sort in order of the long member Angus Comber C Programming 7 02-05-2004 06:41 PM
CRT, Member Initialisation, static data, constant data, global objects Tim C++ 2 12-15-2003 07:15 PM
How is member initialisation ordered? Jason Heyes C++ 6 12-04-2003 11:19 AM
String operations in member initialisation list Samuele Armondi C++ 4 06-25-2003 07:59 PM



Advertisments