Cette définition fonctionne:
const auto &b{nullptr};
alors que cela échoue:
auto *b{nullptr};
J'ai essayé de compiler cela dans Visual C++, GCC et Clang. Ils se plaignent tous "de ne pas pouvoir déduire le type".
Dans le second cas, b
ne devrait pas être déduit pour avoir un type comme std::nullptr_t
?
C'est parce que vous déclarez que b
est un pointeur et que vous l'initialisez comme un pointeur nul. Mais un pointeur nul vers le type de données que vous ne dites pas, donc le compilateur ne peut pas déduire le type.
Si vous voulez que b
soit un std::nullptr_t
objet, vous devez supprimer l'astérisque:
auto b{nullptr};
decltype(nullptr)
est std::nullptr_t
.
donc avec
const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)
mais nullptr
n'est PAS un pointeur (même s'il est convertible en).
alors auto *b{nullptr};
est invalide.
Vous pourriez utiliser à la place
auto b{nullptr}; // auto is std::nullptr_t
nullptr
est de type std::nullptr_t
. Comme un nullptr
ne pointe vers rien, il n'y a pas de type de pointe correspondant pour std::nullptr_t
(vous n'êtes pas autorisé à déréférencer un nullptr
), d'où
auto *b { nullptr};
demande un type qui n'existe pas. Si vous souhaitez que b
soit de type nullptr_t
écrivez simplement
auto b { nullptr};