Lesen Sie diesen Artikel: Anzeigen und Verschwinden von Konstanten in C ++
Der Typabzug für automatische Variablen in C ++ 0x ist im Wesentlichen der gleiche wie für Vorlagenparameter. (Soweit ich weiß, besteht der einzige Unterschied zwischen den beiden darin, dass der Typ der automatischen Variablen möglicherweise aus Initialisierungslisten abgeleitet wird, während der Typ der Vorlagenparameter möglicherweise nicht abgeleitet wird.) Jede der folgenden Deklarationen deklariert daher Variablen vom Typ int ( nie const int):
auto a1 = i;
auto a2 = ci;
auto a3 = *pci;
auto a4 = pcs->i;
Während des Typabzugs für Vorlagenparameter und automatische Variablen werden nur Konstanten der obersten Ebene entfernt. Bei einer Funktionsvorlage, die einen Zeiger oder Referenzparameter verwendet, bleibt die Konstanz dessen, worauf gezeigt oder verwiesen wird, erhalten:
template<typename T>
void f(T& p);
int i;
const int ci = 0;
const int *pci = &i;
f(i);
f(ci);
f(*pci);
Dieses Verhalten ist eine alte Nachricht und gilt sowohl für C ++ 98 als auch für C ++ 03. Das entsprechende Verhalten für automatische Variablen ist natürlich neu in C ++ 0x:
auto& a1 = i;
auto& a2 = ci;
auto& a3 = *pci;
auto& a4 = pcs->i;
Da Sie das cv-Qualifikationsmerkmal beibehalten können, wenn der Typ eine Referenz oder ein Zeiger ist, können Sie Folgendes tun:
auto& my_foo2 = GetFoo();
Anstatt es angeben zu müssen als const
(dasselbe gilt für volatile
).
Bearbeiten: Beachten Sie auto
Folgendes, warum der Rückgabetyp GetFoo()
als Wert anstelle einer Referenz abgeleitet wird (was leider Ihre Hauptfrage war):
const Foo my_foo = GetFoo();
Das obige erstellt eine Kopie, da my_foo
es sich um einen Wert handelt. Wenn auto
eine Wertreferenz zurückgegeben würde, wäre dies nicht möglich.