const int ci = 10;
auto i = ci; // i will be \"int\" instead of \"const int\"
i = 20;
I am wondering why auto is designed for this kind of behavio
auto
mostly follows the same type deduction rules as template argument deduction. The only difference is that auto
will deduce std::initializer_list
from a braced-init-list in some cases, while template argument deduction doesn't do this.
From N3337, §7.1.6.4 [dcl.spec.auto]
6 ... The type deduced for the variable
d
is then the deducedA
determined using the rules of template argument deduction from a function call (14.8.2.1), ...
The behavior you're observing is the same as what template argument deduction would do when deducing types from a function call
§14.8.2.1 [temp.deduct.call]
2 If
P
is not a reference type:
— ...
— IfA
is a cv-qualified type, the top level cv-qualifiers ofA
’s type are ignored for type deduction.
Thus, in
auto i = ci;
the top level const
qualifier is ignored and i
is deduced as int
.
When you write
auto& i = ci;
then i
is no longer not a reference type and the above rule doesn't apply, so the const
qualifier is retained.