webentwicklung-frage-antwort-db.com.de

Warum funktioniert const auto & p {nullptr}, während auto * p {nullptr} in C ++ 17 nicht funktioniert?

Diese Definition funktioniert:

const auto &b{nullptr};

während dies fehlschlägt:

auto *b{nullptr};

Ich habe versucht, dies in Visual C++, GCC und Clang zu kompilieren. Sie alle beschweren sich, "Typ kann nicht herleiten".

Sollte im zweiten Fall nicht b auf einen Typ wie std::nullptr_t Geschlossen werden?

31
felix

Das liegt daran, dass Sie b als Zeiger deklarieren und als Nullzeiger initialisieren. Ein Null-Zeiger auf den Datentyp, den Sie nicht angeben, sodass der Compiler den Typ nicht ableiten kann.

Wenn Sie möchten, dass b ein std::nullptr_t - Objekt ist, müssen Sie das Sternchen löschen:

auto b{nullptr};
37

decltype(nullptr) ist std::nullptr_t.

so mit

const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)

aber nullptr ist KEIN Zeiger (auch wenn er konvertierbar ist).

so auto *b{nullptr}; ist ungültig.

Sie könnten stattdessen verwenden

auto b{nullptr}; // auto is std::nullptr_t
16
Jarod42

nullptr ist vom Typ std::nullptr_t. Da ein nullptr auf nichts verweist, gibt es für std::nullptr_t Keinen entsprechenden Spitzentyp (Sie dürfen also kein nullptr dereferenzieren)

auto *b { nullptr};

fordert einen Typ an, der nicht existiert. Wenn Sie möchten, dass b vom Typ nullptr_t Ist, schreiben Sie einfach

auto b { nullptr};