この記事を読む:C++での定数の表示と非表示
C ++ 0xでの自動変数の型推定は、基本的にテンプレートパラメーターの場合と同じです。(私が知る限り、この2つの違いは、自動変数のタイプが初期化子リストから推測できるのに対し、テンプレートパラメーターのタイプは推測できないことです。)したがって、次の各宣言はint型の変数を宣言します(決してconstint):
auto a1 = i;
auto a2 = ci;
auto a3 = *pci;
auto a4 = pcs->i;
テンプレートパラメータと自動変数の型推定中に、最上位の定数のみが削除されます。ポインターまたは参照パラメーターを受け取る関数テンプレートが与えられると、ポイントまたは参照されるものすべての恒常性が保持されます。
template<typename T>
void f(T& p);
int i;
const int ci = 0;
const int *pci = &i;
f(i); // as before, calls f<int>, i.e., T is int
f(ci); // now calls f<const int>, i.e., T is const int
f(*pci); // also calls f<const int>, i.e., T is const int
この動作は古いニュースであり、C++98とC++03の両方に適用されます。もちろん、自動変数に対応する動作は、C++0xの新機能です。
auto& a1 = i; // a1 is of type int&
auto& a2 = ci; // a2 is of type const int&
auto& a3 = *pci; // a3 is also of type const int&
auto& a4 = pcs->i; // a4 is of type const int&, too
タイプが参照またはポインターの場合はcv修飾子を保持できるため、次のことができます。
auto& my_foo2 = GetFoo();
として指定する代わりにconst
(同じことがvolatile
)になります。
編集:なぜ参照の代わりに値としてauto
の戻り型を推測するのかGetFoo()
(これはあなたの主な質問でした、申し訳ありません)、これを考慮してください:
const Foo my_foo = GetFoo();
上記はmy_foo
値であるため、コピーを作成します。左辺値参照を返す場合auto
、上記は不可能です。