82

次の簡単なコードを見てください。

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 my_foo = GetFoo();

これは、関数の戻り型である、my_fooへの定数参照になると思いました。Fooただし、のタイプautoFoo、参照ではなくです。さらに、my_fooをコピーして作成しg_tempます。この振る舞いは私にはそれほど明白ではありません。

への参照を取得するには、次のFooように記述する必要があります。

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

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

4

1 に答える 1

67

この記事を読む: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、上記は不可能です。

于 2011-08-21T14:00:24.030 に答える