Initialisation of reference vs. initialisation of reference member

T

Tim Clacy

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
 
J

Jim Langston

Tim Clacy said:
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.
 
T

Tim Clacy

Jim said:
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.
 
S

shailesh

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.
 
T

Tim Clacy

shailesh said:
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.

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 :-(
 
J

John Carson

shailesh said:
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.

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

Tim Clacy

John said:
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.
 
T

Tomás

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
 
T

Tim Clacy

Tomás said:
Tim Clacy posted:



C++ handles this under the hood as:


unsigned const literal_2 = 2;

unsigned const &u = literal_2;





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

unsigned const u = 2;





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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,906
Latest member
SkinfixSkintag

Latest Threads

Top