1. ホーム
  2. c++

c++11でポインタの'auto'型代入は'*'を必要としますか?

2023-07-25 22:07:12

質問

変数がポインタである場合、それを "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();

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

更新しました。 私は、私のベクトルが実際に関数に入力され、私はちょうど変数に返されたポインタを代入しようとしている方法をより明確にするために、上記を修正しました。 混乱させて申し訳ありません。

どのように解決するのですか?

auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

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

を使用して同様の不確実性があるとは夢にも思わなかったと言わざるを得ません。 auto . 私は、人々は単に auto を使うだけで、それについて考えることはないだろうと思っていました。 auto を何かで飾る必要があるのは、リファレンスやcv-qualifiersのときだけです。

しかし、そこに を少し修正すると、両者の間にわずかな差が生じます。

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. 一つの宣言の中に複数の宣言子がある場合、それら全てに対して行われる。このとき、推論された T はすべて同じでなければなりません。