80

変数がポインターである場合、それを「auto」型の変数に割り当てる場合、「*」を指定しますか?

std::vector<MyClass> *getVector(); //returns populated vector
//...

std::vector<MyClass> *myvector = getVector();  //assume has n items in it
auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

//goal is to behave like this assignment:
std::vector<MyClass> *newvar3 = getVector();

これが c++11 でどのように機能するかについて少し混乱していますauto(これは c++11 の新機能ですよね?)

更新:上記を修正して、ベクターが実際に関数にどのように取り込まれているかをより明確にしました。返されたポインターを変数に割り当てようとしています。混乱させて申し訳ありません

4

3 に答える 3

73
auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

これらはどちらも同じで、へのポインタを宣言しますstd::vector<MyClass> myvector(あなたの例では初期化されておらず、ゴミが含まれている可能性があるため、ランダムな場所を指しています). したがって、基本的にはどれでも使用できます。私は を好みauto var = getVector()ますが、それが意図 (つまりポインター) をよりauto* var = getVector()強調すると思う場合は、選択することができます。var

を使用して同様の不確実性が得られるとは夢にも思わなかったと言わざるを得ませんauto。私は、人々はそれを使用するだけで考えautoないだろうと思っていました.99%の確率で正しいですauto.何かで装飾する必要があるのは、参照とcv修飾子だけです.

ただし、わずかに変更すると、2 つの間にわずかな違いがあります

auto newvar1 = myvector, newvar2 = something;

この場合、newvar2はポインターになります (そして、何かもそうでなければなりません)。

auto *newvar1 = myvector, newvar2 = something;

ここでnewvar2は、ポインティ タイプです。std::vector<MyClass>、および初期化子は適切でなければなりません。

一般に、イニシャライザが波括弧で囲まれたイニシャライザ リストでない場合、コンパイラは次のautoように処理します。

  1. これは、宣言子の正確な形式の 1 つの引数を使用して人工関数テンプレート宣言を生成しauto、テンプレート パラメーターに置き換えます。だからauto* x = ...、それは使用します

    template <class T> void foo(T*);
    
  2. 呼び出しを解決しようとしfoo(initializer)、何が推定されるかを調べますT。これは の代わりに置き換えられautoます。

  3. 1 つの宣言に複数の宣言子がある場合、これはすべての宣言に対して行われます。演繹されTたものはすべて同じでなければなりません...

于 2012-10-07T22:13:33.930 に答える
2
auto newvar1 = *myvector;

これはおそらく、実際のベクトルのコピーを作成するものです。代わりに参照auto& newvar1 = *myvector;を作成するか、同じベクトルへの別のポインターを作成する場合は、 を使用しますauto newvar1 = myvector;。他の試みとの違いauto *newvar1 = myvector;は、後者が一度 myvector をポインター型に強制するため、次のコードが失敗することです。

std::vector<int> v1;
auto* v2 = v1; // error: unable to deduce ‘auto*’ from ‘v1’
于 2012-10-07T23:31:17.110 に答える