web-dev-qa-db-ja.com

`auto pp`と` auto * ppp`の違いは何ですか?

int foo = 11;
int *p = &foo;

auto pp = p;
auto *ppp = p;

cout << pp << endl;
cout << ppp << endl;

このプログラムはpppppに対して同じ出力を生成しますが、なぜですか? autoは、変数がintであるべきだと推測するので、pppの宣言は正しいと思います。ただし、pppppの値は同じです...

出力:

0x61fefc
0x61fefc
20
廖茂生

示す特定の例では、違いはありません。ただし、後で次のような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では、autointと一致し、これがconstの適用対象です。

この顕著な違いと、可能な限りconst変数を使用する必要があるため、ポインター変数の型推論を使用するときは、常にauto*を使用することをお勧めします。指示先の代わりにポインタ自体をconst修飾する方法はありません。両方をconst修飾する場合は、

const auto * const pppp = p;

*なしでは機能しません。

30
lubgr

この特定のケースでは、autoauto *に違いはありません。 auto pp = p;の場合、タイプはint *に推定されますが、auto *ppp = p;の場合、タイプはintに推定されます。

auto修飾子

変数の場合、宣言されている変数の型が初期化子から自動的に推測されることを指定します。 [...]

autoとは異なり、auto *はポインター型のみを推定することに注意してください。

7
haccks