13

2011 C++ 標準では、新しいキーワード が導入されましたauto。これは、型の代わりに変数を定義するために使用できます。

auto p=make_pair(1,2.5);                   // pair<int,double>
auto i=std::begin(c), end=std::end(c);     // decltype(std::begin(c))

2 行目のiendは同じタイプで、 として参照されautoます。標準では許可されていません

auto i=std::begin(container), e=std::end(container), x=*i;

x異なるタイプになるのはいつですか。私の質問: 標準では、この最後の行が許可されていないのはなぜですか? これは、推定される型を表すものとしてではなく、宣言された変数autoの型が割り当てられた値から推定されることを示すものとして解釈することによって許可される可能性があります。C++11 標準がこのアプローチに従わない正当な理由はありますか?auto

これには実際に使用例があります。つまり、forループの初期化ステートメントです。

for(auto i=std::begin(c), end=std::end(c), x=*i;  i!=end;  ++i, x+=*i)
{ ... }

変数iend、およびのスコープがループxに限定されている場合。for私の知る限り、これらの変数に共通の型がない限り、これは C++ では実現できません。これは正しいです?struct(すべてのタイプを除外の中に入れる醜いトリック)

一部の可変個引数テンプレート アプリケーションで使用される場合もあります。

4

4 に答える 4

9

auto非宣言との一貫性の問題だと思います。

これ:

auto n = 42, *p = &n;

次と同等です。

int n = 42, *p = &n;

ここで、型intと型int*は初期化子から派生しています。どちらの場合も、intint*は異なる型ですが、構文上の関係が近いため、同じ宣言にすることができます。(C および C++ の宣言がほぼn従う「宣言は使用に従う」という規則により、 と の両方を*ptype として定義していますint。)

同じ宣言で無関係な型を許可することは可能でした:

auto n = 42, x = 1.5;

ただし、上記は 2 つの別個の宣言と同等でなければなりません。

int n = 42; double x = 1.5;

追加時のアイデアautoは、言語に最小限の変更を加え、初期化子から型を推測できるようにすることでしたが、可能な宣言の種類は変更しませんでした。

がなくても、ループ ヘッダーで anと anをauto定義できます。intint*for

for (int n = 42, *p = &n; expr1; expr2) { /* ... / }

intただし、 anと adoubleを一緒に宣言することはできません。を追加autoしても、それは変わりませんでした。

ループのコンテキストの外では、for通常、個別の宣言を使用する方がはるかに優れています。多くの異なる宣言をforループに押し込むことは、ほとんどの場合、間違いなく悪い考えです。そして、多くの宣言が必要な (おそらくまれな) ケースでは、次のように、それらをループの上に置くことができます。

auto i=std::begin(c), end=std::end(c),
for( x=*i;  i!=end;  ++i, x+=*i) {
    // ...
}

{ }範囲を制限したい場合は、全体の周りに別のセットを追加します。(この場合、おそらくとにかくなりたいと思うでしょうend。 )const

于 2013-10-31T21:50:11.947 に答える
-2

C++ 2014 ワーキング ドラフトを参照する場合、標準ではそのようなコードが許可されています。標準ドラフトの例を次に示します。

auto x = 5, *y = &x; // OK: auto is int

あなたの例では、反復子の型と反復子の値の型は2つの異なる型であるため、 auto を使用できないことを追加したいと思います。

于 2013-10-31T13:08:08.220 に答える