2011-08-21 8 views
59

次の簡単なコードを見てください:私はmy_fooがリターンですFooに一定の基準、になると予想C++ 11 auto:定数参照を取得するとどうなりますか?

auto my_foo = GetFoo(); 

class Foo 
{ 
public: 
    Foo(){} 
    ~Foo(){} 

    Foo(const Foo&){} 
    Foo& operator=(const Foo&) { return *this; } 
}; 

static Foo g_temp; 
const Foo& GetFoo() { return g_temp; } 

を私はこのようなautoを使用しようとしました関数の型。しかし、autoの種類はFoo、ではないの参照です。さらに、my_foog_tempをコピーして作成されます。この行動は私には明らかではありません。

Fooへの参照を取得するために、私はこのように書くために必要な:

const auto& my_foo2 = GetFoo(); 
     auto& my_foo3 = GetFoo(); 

質問:なぜautoはオブジェクトではなく、参照としてGetFooの戻り値の型を推測しますか?

+0

どのコンパイラを使用していますか? –

+0

VC++ 2010およびIntel C++コンパイラ – minjang

答えて

49

この記事を読む:C++ 0xの中の自動変数のAppearing and Disappearing consts in C++


型推論は、基本的にテンプレートパラメータのための と同じです。 (私の知る限りでは、両者の間の唯一の違い は、テンプレートパラメータの種類はないかもしれないが、自動変数の型は、 初期化子リストから推定することができるということである。) 次の宣言はそれぞれ、そのための変数を宣言 INT(決してのconst int型)タイプ:テンプレートパラメータと自動変数の型推論中に

auto a1 = i; 
auto a2 = ci; 
auto a3 = *pci; 
auto a4 = pcs->i; 

を、唯一 トップレベルconstsが削除されます。 ポインタまたは参照パラメータを取る関数テンプレートを考えると、 尖ったまたは呼ばれているものは何でものconst性が保持されます。

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-修飾子を保持することができますので、あなたができます実行します。代わりにconstとして指定することの

auto& my_foo2 = GetFoo(); 

(同じことがvolatileのために行きます)。

編集:(あなたのメインの質問、申し訳ありませんでした)autoではなく、参照の値としてGetFoo()の戻り値の型を推論する理由については、このことを考慮してください。

const Foo my_foo = GetFoo(); 

上記作成されます。 my_fooは値です。 autoが左辺値参照を返す場合、上記は不可能です。

+5

ref-qualifierも削除される理由については説明しませんでした。 –

+3

@Tomalak Geret'kal:あなたはなぜこれをすることにしたの?それは理にかなっていますか?これを考えてみましょう: 'Foo my_foo = GetFoo();'そして 'GetFoo()'はconst型を返しませんでした。これは、 'auto my_foo = GetFoo();'と同じです。オートリファレンスにも含まれている場合は、上記を行うことはできません。 – someguy

+5

教えてください。あなたの答えに入れてください。 –

関連する問題