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?
Pourriez-vous corriger votre code afin qu'il implique un temporaire? –
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
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 ... –