Let’s consider the following code snippet
void Test()
{
int x = 0;
int& rx = x;
int* px = &x;
auto apx = px; // deduced type is int*
auto arx = rx; // deduced type is int
}
One could draw an analogy from pointer types expecting that the deduced type of arx is int&, but it is int in fact.
What is the rule in Standard which governs that? What is the reason behind it?
Sometimes I get caught by it in a case like this:
const BigClass& GetBigClass();
...
auto ref_bigclass = GetBigClass(); // unexpected copy is performed
The simplest way to think about it is comparing it to template argument deduction.
Given:
If you call:
then the template argument
Twill be deduced asint*and if you callthen
Twill be deduced asint, notint&You get the same types deduced when using
auto.You’d have to have a fairly confused model of the C++ language to make that analogy. Just because they are declared in syntactically similar ways, as
Type@with a type and a modifier doesn’t make them work the same way. A pointer is a value, an object, and it can be copied and have its value altered by assignment. A reference is not an object, it’s a reference to some object. A reference can’t be copied (copying it copies the referent) or altered (assigning to it alters the referent). A function that returns a pointer returns an object by value (the object in question being a pointer object), but a function that returns a reference (like yourGetBigClass()) returns an object by reference. They’re completely different semantics, trying to draw analogies between pointers and references is doomed to failure.