J'ai une fonction address_of
, qui renvoie un Pointer
(encapsulant un shared_ptr
) à son argument. address_of
doit fonctionner à la fois sur lvalues et rvalues, donc il existe deux versions de address_of
: l'une acceptant une référence et l'autre acceptant une référence rvalue. Depuis prendre l'adresse d'un temporaire est une mauvaise chose ™, la version rvalue de address_of
doit effectuer une construction de mouvement afin que le Pointer
possède réellement quelque chose. La mise en œuvre est simple:Prendre l'adresse d'un temporaire, avec un Twist
template<class T>
inline Pointer address_of(T& value) {
return Pointer(&value);
}
template<class T>
inline Pointer address_of(T&& value) {
return Pointer(new T(std::move(value)));
}
Et prenant l'adresse d'un ouvrage temporaire comme prévu:
Pointer p = address_of(Derived());
Mais quand je test avec le code suivant:
Base* object = new Derived();
Pointer p = address_of(*object);
GCC se plaint que la appeler au address_of
est ambigu:
error: call of overloaded ‘address_of(Base&)’ is ambiguous
note: candidates are: Pointer address_of(T&) [with T = Base]
note: Pointer address_of(T&&) [with T = Base&]
J'étais sous l'impression que *
unaire renvoie toujours une lvalue, auquel cas la version de rvalue ne devrait même pas être considérée. Qu'est-ce qui se passe exactement ici?
Cela a du sens, merci. Des pensées sur la façon d'atteindre le comportement que je * veux *? –
Qu'est-ce que la décroissance de référence? –
@Jon - un. Pas positif ça va marcher mais je l'ai mis dans ma réponse. –