web-dev-qa-db-fra.com

Pourquoi const auto & p {nullptr} fonctionne-t-il alors que auto * p {nullptr} ne fonctionne pas en C ++ 17?

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?

31
felix

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

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
16
Jarod42

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