Considérons le morceau de code suivant :
void foo (M&) {}
M m;
foo ({m});
Ainsi, l'expression {m}
est traitée comme une référence à une valeur rationnelle et c'est pourquoi ce code ne peut pas être compilé.
Est-il vrai que {object}
produit toujours un objet temporaire ?
Si ce n'est pas le cas, comment s'en assurer lorsque cela se produit ? Si oui, veuillez considérer le code suivant :
struct M {};
struct I {
I (M&) {}
};
struct MM {
MM (M& p)
: m (p), i ( {p} )
{}
M& m;
I i;
};
M m;
MM mm {m};
Ici, il n'y a aucun problème, alors quelle est la différence entre {m}
du premier exemple et {p}
de la seconde ?
Résultats du compilateur (GCC 4.8.1) (premier exemple) :
main.cpp:366:13: error: invalid initialization of non-const reference of type ‘M&’ from an rvalue of type ‘<brace-enclosed initializer list>’
foo ({m});
^
main.cpp:359:6: error: in passing argument 1 of ‘void foo(M&)’
void foo (M&) {}