2010-11-10 5 views
6

référencer Je suis à la recherche code du formulaire suivant:valeur initialisation d'un membre const

class foo 
{ 
    public: 
    foo() {} 

    //... 
}; 

class bar 
{ 
    public: 
    bar() : ref() {} 

    private: 
    const foo &ref; 
}; 

initialise une référence à l'aide temporaire de cette façon correcte? Je sais qu'il est possible d'initialiser une référence const qui est une variable locale avec un temporaire, et que cela prolonge la durée de vie du temporaire, par ex.

const foo &tmp = funcThatReturnsByValue(); //OK 

Cependant, l'une des réponses à la initialize reference in initialization list connexes suggère qu'il ya une différence entre les références « à court terme » et « long terme », et que l'initialisation ref comme ci-dessus est un comportement non défini (même si ref est une référence const). 12.2.5 dans la norme dit, en partie, "Une liaison temporaire à un membre de référence dans un ctor-initialiseur d'un constructeur persiste jusqu'à la sortie du constructeur." Est-ce que cela décrit cette situation?

+0

Pourriez-vous corriger votre code afin qu'il implique un temporaire? –

+0

ref() ne lie pas ref à une instance temporaire de foo? Désolé si ma terminologie est imprécise ... Je fais de mon mieux pour comprendre cet extrait de code. – user168715

+0

Peut-être que ce commentaire est sans valeur (je ne connais pas le contexte dans lequel vous regardez ce code), mais le problème disparaît si 'ref' est un pointeur. Le point est que les références ne peuvent pas être initialisées par la valeur, mais les pointeurs peuvent (ils sont initialisés à zéro). De plus, la plupart des compilateurs (au moins MSVC) émettent un avertissement pour être incapables de générer un opérateur d'affectation par défaut. A titre indicatif, chaque fois que vous voulez un membre de référence, vous voulez en fait un pointeur ... –

Répondre

4

Ce code est mal formé. Vous ne pouvez pas par défaut initialiser ou valeur initialiser une référence.

Si vous aviez réellement une expression à l'intérieur de ref(), alors oui, 12.2.5 s'appliquerait et le temporaire serait détruit lorsque le constructeur se terminerait.

+1

On pourrait penser, mais je ne peux pas obtenir GCC 4.3.4 pour le faire réellement. –

1

Je suppose que ce que vous voulez faire est:

bar() : ref(foo()) {} 

mais ne pense pas naïvement que la durée de vie d'un est prolongé temporaire jusqu'à ce qu'il ya une référence. Non, ce n'est pas le cas. Donc, que ce soit const ou non, vous devez initialiser la référence avec un objet normal.

2

Votre exemple ne crée pas temporaire - à faire que vous devez changer:

bar() : ref(foo()) {} 

Maintenant vous lier la référence à un temporaire, et cet objet temporaire sera détruit à la fin du constructeur. Votre référence sera invalide, et ce n'est pas une bonne chose.

Questions connexes