44 votes

Pourquoi ne pouvez-vous pas prendre l'adresse de nullptr?

Dans le standard C++11, je ne comprends pas la raison pourquoi prendre l'adresse de nullptr est rejetée, alors que l'on est autorisé à prendre l'adresse de leur propre std::nullptr_t instances. Hormis le fait que nullptr est un mot clé réservé, est-il désigné le raisonnement de cette décision?

Tout simplement parce que cela m'amuse, j'ai tenté de contourner cette restriction avec la fonction suivante:

decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
    return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}

J'ai eu à utiliser reinterpret_cast sur le paramètre, car sans elle, j'ai été faire l'hystérique erreur:

error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]

Lorsque j'appelle cette fonction en passant nullptr directement-je obtenir une adresse différente à chaque fois. Est nullptr attribuée dynamiquement une adresse juste à temps pour les comparaisons et le tel? Ou (plus probable) est peut-être le compilateur forcer une copie temporaire de l'objet sous-jacent?

Bien entendu, tout cela est l'information essentielle, je viens de le trouver intéressant, pourquoi cette restriction a été mise en œuvre (et par la suite pourquoi je vois le comportement que je suis).

84voto

Potatoswatter Points 70305

C'est la même chose que de ne pas pouvoir prendre l'adresse de l' 5 même si vous pouvez prendre l'adresse d'un int après lui donnant la valeur 5. Sauf que dans ce cas il n'y a aucune autre valeur pour nullptr_t à avoir.

Les valeurs n'ont pas d'adresses; les objets ne.

Un objet temporaire est généré lorsque vous passez une telle valeur à un const & paramètre, ou au contraire de se lier à une valeur de const référence, comme par static_cast< T const & >( … ) ou de déclarer un nom de référence T const & foo = …;. L'adresse que vous voyez n'est que temporaire.

28voto

chris Points 28950

Si vous êtes après une réponse standard, § 18.2/9 met vos observations assez brutalement:

Bien que nullptr de l'adresse ne peut être prise, l'adresse d'un autre nullptr_t objet qui est une lvalue peut être prises.

Sinon, § 2.14.7 dit ceci à propos de nullptr:

Le pointeur littéral est le mot-clé nullptr. C'est un prvalue de type std::nullptr_t.

Alors, quel est un prvalue? § 3.10/1 réponses que:

Un prvalue ("pure" rvalue) est une rvalue qui n'est pas un value. [ Exemple: Le résultat de l'appel d'une fonction dont le type de retour n'est pas une référence est un prvalue. La valeur d'un littéral comme 12, 7.3e5, ou vrai est aussi un prvalue. fin de l'exemple ]

Espérons-le, en essayant de prendre l'adresse de l'une de ces choses dans l'exemple aura plus de sens pour expliquer pourquoi vous ne pouvez pas prendre l'adresse de l' nullptr. Il fait partie de ces exemples!

10voto

leemes Points 17391

nullptr est un (littérale) de la constante, et on ne peut pas avoir une adresse en mémoire, comme n'importe quel autre constante littérale dans votre code. Il est similaire à l' 0, mais de la spéciale, std::nullptr_t type, au lieu d' void* pour éviter les problèmes de surcharge (pointeurs vs entiers).

Mais si vous définissez votre propre variable avec la valeur nullptr, il a une adresse en mémoire, de sorte que vous pouvez prendre à son adresse.

La même chose vaut pour n'importe quel autre constante littérale (qui en C++ relèvent de la catégorie prvalue) de tout autre type, puisque les constantes littérales ne sont pas stockées dans votre programme (seulement les parties d'expressions où ils se produisent), c'est pourquoi il ne ferait aucun sens de parler d'adresses. Cependant, la constante variables n'ont adresses, de souligner la différence.

4voto

Ahmed Kato Points 893

True et false sont des mots-clés et, en tant que littéraux, ils ont un type (bool). nullptr est un littéral de pointeur de type std :: nullptr_t, et c'est une valeur (vous ne pouvez pas en prendre l'adresse à l'aide de &), mais nullptr est une valeur ainsi vous ne pouvez pas prendre son adresse, les constantes littérales ne sont pas stockées dans votre programme.

Cela n'a pas de sens d'avoir une adresse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X