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 2005
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 2005
j'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
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
[...]
J'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.