2016-06-03 6 views
0

Ich bin unklar über die Verwendung von Auto in einer Funktion, die ich überschaue. Bei einem gegebenen Parameter wie definiert:erkennt automatisch, dass ein Typ ein Zeiger ist?

someFunction(const unique_ptr<BSTNode<int>>& node, paramType param) {

der Körper der Funktion stellt eine lokale Variable wie folgt aus:

auto *localNode = node.get();

Mein Verständnis von Auto ist, dass es die Art der folgert, was zugeordnet ist dazu zur Kompilierzeit. Die Dokumentation gibt an, dass unique_ptr::get() einen Zeiger auf das Objekt zurückgibt, das es verwaltet. Angesichts dieser Tatsache, warum ist es notwendig, * der Variablendeklaration hinzuzufügen?

Antwort

3

Warum ist es notwendig, * zur Variablendeklaration hinzuzufügen?

Es ist nicht. Der Vorteil ist, dass es für den Leser äußerst offensichtlich ist, dass localNode ein Zeiger ist.

+0

aber wenn Auto bereits den Typ auf einen Zeiger ableitet, würde das Hinzufügen eines zusätzlichen * nicht zu einem ** Typ führen? –

+0

@ user5797668 Nein, "auto" bedeutet nicht "den Typ des Initialisierers"; es bedeutet ungefähr "welcher Typ auch immer benötigt wird, um den Typ des Initiators zu treffen". –

3

Die Verwendung eines *, um einen Zeiger abzuleiten, ist unnötig, kann aber wünschenswert sein. Wenn der Code später so geändert wird, dass der Initialisierer keinen Zeiger mehr zurückgibt, führt der * dazu, dass der automatische Abzug fehlschlägt. Wenn der Code, der diese Variable verwendet, mit einem Zeiger entworfen wird, kann das eine gute Sache sein.