"Si vous renvoyez une valeur (pas une référence) de la fonction, puis la liez à une référence const dans la fonction appelante, sa durée de vie serait étendue à la portée de la fonction appelante."Comment sa durée de vie d'une valeur de retour est-elle étendue à la portée de la fonction appelante lorsqu'elle est liée à une référence const dans la fonction appelante?
Alors: CASE A
const BoundingBox Player::GetBoundingBox(void)
{
return BoundingBox(&GetBoundingSphere());
}
Renvoie une valeur de type const BoundingBox
de la fonction GetBoundingBox()
variante I: (Bind à une référence const)
const BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
variante II: (Liez-le à une copie const)
const BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
Les deux fonctionnent bien et je ne vois pas l'objet l_Bbox
sortir du cadre. (Bien que, je comprends dans la variante un, le constructeur de copie n'est pas appelé et est donc légèrement mieux que la variante II).
Aussi, pour comparaison, j'ai apporté les modifications suivantes.
CASE B
BoundingBox Player::GetBoundingBox(void)
{
return BoundingBox(&GetBoundingSphere());
}
avec des variantes: Je
BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
et II:
BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
L'objet l_Bbox
ne marche toujours pas la portée. Comment "le lier à une référence const dans la fonction appelante, sa durée de vie serait étendue à la portée de la fonction appelante", étendre réellement la durée de vie de l'objet à la portée de la fonction appelante?
Est-ce que je manque quelque chose de trivial ici?
Le fait qu'il semble fonctionner sur votre compilateur spécifique (c'est-à-dire, btw ...?) Ne signifie pas qu'il va fonctionner sur n'importe quel autre compilateur, ni qu'il est bien défini et légal. –
@Peter: J'utilise MSVC 2008. Ce qui m'échappe c'est pourquoi/comment const peut-il avoir un effet sur la prolongation de la durée de vie? À mon avis, cela empêche quiconque d'apporter des modifications à l'objet (correction de const. Etc) et c'est tout. – brainydexter
Votre variante I semble un peu drôle - votre compilateur accepte-t-il vraiment cela sans se plaindre?Il semble que vous initialisiez une référence à non-const avec un rvalue, ce qui ne devrait pas être autorisé. –