98 votes

Les références rvalue à const ont-elles une utilité ?

Je suppose que non, mais j'aimerais confirmer. Y a-t-il une utilité pour const Foo&& , donde Foo est un type de classe ?

2 votes

Dans cette vidéo, STL dit const&& sont très importants, bien qu'il ne dise pas pourquoi : youtube.com/watch?v=JhgWFYfdIho#t=54m20s

85voto

Howard Hinnant Points 59526

Ils sont occasionnellement utiles. Le projet C++0x lui-même les utilise à quelques endroits, par exemple :

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

Les deux surcharges ci-dessus assurent que l'autre ref(T&) y cref(const T&) ne se lient pas aux rvalues (ce qui serait possible autrement).

Mise à jour

Je viens de vérifier la norme officielle N3290 qui n'est malheureusement pas accessible au public, et qui comporte en 20,8 des objets fonctionnels [function.objects]/p2 :

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

J'ai ensuite vérifié le projet post-C++11 le plus récent, qui est accessible au public, N3485 et dans 20.8 Objets fonctionnels [function.objects]/p2, il est toujours indiqué :

template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

0 votes

Regarder Référence cpp il semble que ce ne soit plus le cas. Avez-vous une idée de la raison ? D'autres endroits const T&& est utilisé ?

0 votes

En fait, cppreference pourrait simplement ne pas afficher les fonctions supprimées. Je n'ai pas vérifié la norme.

0 votes

@Pubby cppreference affiche certainement les fonctions supprimées, celles-ci ont été omises par erreur.

5voto

user2079303 Points 4916

Outre std::ref la bibliothèque standard utilise également la référence const rvalue dans les éléments suivants std::as_const dans le même but.

template <class T>
void as_const(const T&&) = delete;

Il est également utilisé comme valeur de retour dans std::optionnel lors de la récupération de la valeur enveloppée :

constexpr const T&& operator*() const&&;
constexpr const T&& value() const &&;

Ainsi que dans std::get :

template <class T, class... Types>
constexpr const T&& get(const std::variant<Types...>&& v);
template< class T, class... Types >
constexpr const T&& get(const tuple<Types...>&& t) noexcept;

Ceci est vraisemblablement destiné à maintenir la catégorie de valeur ainsi que la constance de l'enveloppe lors de l'accès à la valeur enveloppée.

Cela permet de déterminer si les fonctions qualifiées de const rvalue peuvent être appelées sur l'objet enveloppé. Cela dit, je ne connais pas d'utilisation des fonctions qualifiées de const rvalue ref.

5voto

Gene Bushuyev Points 3819

Ils sont autorisés et même des fonctions classées en fonction de const mais comme vous ne pouvez pas passer d'un objet constant référencé par const Foo&& ils ne sont pas utiles.

0 votes

Que voulez-vous dire exactement par la remarque "classé" ? Quelque chose à voir avec la résolution de la surcharge, je suppose ?

0 votes

Pourquoi ne pourrait-on pas se déplacer à partir d'une const rvalue-ref, si le type donné possède un ctor de déplacement qui prend une const rvalue-ref ?

6 votes

@FredOverflow, le classement de la surcharge est le suivant : const T&, T&, const T&&, T&&

2voto

Fred Nurk Points 8927

Je ne vois pas de situation où cela pourrait être utile directement, mais cela pourrait être utilisé indirectement :

template<class T>
void f(T const &x) {
  cout << "lvalue";
}
template<class T>
void f(T &&x) {
  cout << "rvalue";
}

template<class T>
void g(T &x) {
  f(T());
}

template<class T>
void h(T const &x) {
  g(x);
}

Le T dans g est T const, donc f s x est un T const&&.

Il est probable que cela résulte en une erreur de comile dans f (lorsqu'il essaie de déplacer ou d'utiliser l'objet), mais f pourrait prendre une rvalue-ref de sorte qu'elle ne puisse pas être appelée sur des lvalues, sans modifier la rvalue (comme dans l'exemple trop simple ci-dessus).

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