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?
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};
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
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};