67 votes

Solutions de contournement pour l'absence de la fonctionnalité "rvalue references to *this".

J'ai une classe conteneur de proxy autour d'un objet mobile, et je souhaite que le proxy soit capable de donner implicitement une référence rvalue à l'objet sous-jacent, mais seulement lorsque le proxy lui-même est déplacé.

Je pense être en mesure de mettre en œuvre ce comportement conformément à la proposition n2439. "Extension de la sémantique de déplacement à *this" mais elle n'est pas encore disponible dans une version de gcc et ne le sera pas avant un certain temps.

Le code ci-dessous est ce que je cherche à obtenir, mais ce n'est pas possible actuellement. En attendant que cette fonctionnalité soit disponible, existe-t-il des solutions de contournement équivalentes ?

template< class T >
struct movable_proxy {
    operator T&&() && {
        return std::move(value);
    }

    operator const T&() const& {
        return value;
    }

private:
    T value;
};

4voto

dhardy Points 803

Bonne question. J'ai essayé d'écrire une classe proxy similaire récemment, mais je n'ai jamais réussi à trouver une bonne solution. La meilleure solution que j'ai trouvée était d'appeler une fonction membre à chaque utilisation où le proxy devait être une valeur r :

ORef<T> move() {
    return ORef<T>( this->release() );
}

Cela change la sémantique de la déclaration d'une valeur r de std::move(proxy) à proxy.move() mais permet également de renvoyer un objet d'un type différent (implicitement convertible en votre type requis).

Ma pratique de codage en utilisant ceci était de toujours passer les objets proxy en tant que rvalues, ce qui forçait la spécification manuelle de la sémantique (déplacement, référence partagée, copie ou autre), mais cela fait bien sûr des erreurs d'utilisation un problème potentiel (par exemple, l'appel à x.move() avant l'utilisation finale de x ).

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