int foo = 11;
int *p = &foo;
auto pp = p;
auto *ppp = p;
cout << pp << endl;
cout << ppp << endl;
このプログラムはpp
とppp
に対して同じ出力を生成しますが、なぜですか? auto
は、変数がint
であるべきだと推測するので、ppp
の宣言は正しいと思います。ただし、pp
とppp
の値は同じです...
出力:
0x61fefc
0x61fefc
示す特定の例では、違いはありません。ただし、後で次のような2つのconst
修飾子を追加するとします。
const auto pp = p;
const auto *ppp = p;
まだ同じですか?これは次と同じであることがわかります
int * const pp = p; // pointer is readonly
const int *ppp = p; // pointer is readonly
auto pp = p
では、auto
は全体としてint*
と一致し、const
は左側にあるもの(または右側にあるもの、左側に何もない場合)を変更するため)。反対に、auto *ppp = p
では、auto
はint
と一致し、これがconst
の適用対象です。
この顕著な違いと、可能な限りconst
変数を使用する必要があるため、ポインター変数の型推論を使用するときは、常にauto*
を使用することをお勧めします。指示先の代わりにポインタ自体をconst
修飾する方法はありません。両方をconst
修飾する場合は、
const auto * const pppp = p;
*
なしでは機能しません。
この特定のケースでは、auto
とauto *
に違いはありません。 auto pp = p;
の場合、タイプはint *
に推定されますが、auto *ppp = p;
の場合、タイプはint
に推定されます。
auto
修飾子 :
変数の場合、宣言されている変数の型が初期化子から自動的に推測されることを指定します。 [...]
auto
とは異なり、auto *
はポインター型のみを推定することに注意してください。