Bonjour cher Forumers,

Je dispose d'une fonction (contexte) dont le rôle est d'instancier un objet, puis de le passer à une autre fonction.
Clairement, le compilateur va optimiser le passage pour éviter de recopier l'objet. Mais faut-il insister en forçant l'utilisation de Rvalues ?

Voici le code initial :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
        template <class DerivedType>
        void operator()(DerivedType& to_insert) const{
            auto buffer = deriveds.template insert<DerivedType&>(to_insert); //<-- Création
            start_visit(buffer); //<-- Passage
        }
 
        template <class Buffer>
        void start_visit(Buffer buffer) const{ //<-- Réception
            auto visitor = get_visitor(buffer);
            visitor.start_visit(buffer.top());
        }
Voici le code avec Rvalues :
- Un inconvenient des rvalues, c'est de rendre la lecture moins simple.
- Et qu'il faut s'assurer que l'objet ne sera pas réutilisé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
        template <class DerivedType>
        void operator()(DerivedType& to_insert) const{
            auto&& buffer = deriveds.template insert<DerivedType&>(to_insert); //<-- Création
            start_visit(buffer); //<-- Passage
        }
 
        template <class Buffer>
        void start_visit(Buffer&& buffer) const{ //<-- Réception
            auto visitor = get_visitor(buffer);
            visitor.start_visit(buffer.top());
        }
Qu'est-ce qui est préférable ? Dans quelles conditions ? Et pourquoi ?
Merci d'avances pour vos réponses