Bonjour,
après m'être rendu compte que lier une rvalue à une lvalue n'est effectivement pas permis dans la norme contrairement à ce que permet VS 2005j'essaye d'implémenter une sorte de Idioms/Move Constructor, comme le fait auto_ptr ; sauf que VS 2005 me renvoie l'erreur error C2679: '=' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'TReturn' (ou il n'existe pas de conversion acceptable)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 struct SomeType{}; SomeType GetType() { return SomeType (); } void TakeType(SomeType & Other) {} TakeType( GetType() ); // ? Ok pour VS 2005J'ai trouvé un contournement (-> décommenter la ligne // workaround), mais je me demande si je n'ai pas loupé quelque chose ou sinon s'il n'y pas une meilleure parade.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 class TReturn; class TReturnRef { private: TReturn & ref; public: TReturnRef(TReturn & ref) : ref(ref) {} }; class TReturn { public: // template<typename T> // workaround operator TReturnRef() { return TReturnRef(*this); } }; class TUse { public: TUse & operator=(TReturnRef Ref) { return *this; } }; TReturn GetReturn() { return TReturn(); } [...] TUse Use; Use = GetReturn(); // erreur ici [...]
Partager