La réponse courte est oui.
Si l'objet est reçu par la fonction en tant que paramètre de référence const - comme vous l'avez modifié la méthode bar(const A&)
, alors c'est totalement légal. La fonction peut fonctionner sur l'objet, mais l'objet sera détruit après l'appel de la fonction (l'adresse de temporaire peut être prise, mais ne doit pas être stockée et utilisée après l'appel de fonction - voir la raison ci-dessous).
Le foo(A*)
est également légal car l'objet temporaire est détruit à la fin de la fullexpression. Cependant la plupart du compilateur émettra un avertissement sur la prise d'adresse temporaire.
La version originale de bar(A&)
ne doit pas compiler, il est contraire à la norme d'initialiser une référence non-const à partir d'un temporaire.
C++ chapitre norme 12,2
3 [...] objets temporaires sont détruits comme dernière étape dans l'évaluation de la fullexpression (1.9) que (lexicalement) contient le point où ils ont été créés. [...]
4 Il existe deux contextes dans lesquels les temporaires sont détruits à un point différent de la fin de la fullexpression. Le premier contexte est lorsqu'une expression apparaît comme un initialiseur pour un déclarateur définissant un objet. Dans ce contexte, le temporaire qui contient le résultat de l'expression doit persister jusqu'à ce que l'initialisation de l'objet soit terminée. [...]
5 Le deuxième contexte est celui où une référence est liée à un temporaire. Le temporaire auquel la référence est liée ou le temporaire qui est l'objet complet d'un sous-objet dont le temporaire est lié persiste pendant la durée de la référence, sauf indication contraire ci-dessous. Une liaison temporaire à un membre de référence dans le ctorinitializer d'un constructeur (12.6.2) persiste jusqu'à la sortie du constructeur. Une liaison temporaire à un paramètre de référence dans un appel de fonction (5.2.2) persiste jusqu'à la fin de l'expression complète contenant l'appel. Une liaison temporaire à la valeur renvoyée dans une déclaration de retour de fonction (6.6.3) persiste jusqu'à ce que la fonction se termine.
A fullexpression est une expression qui ne soit pas une sous-expression d'une autre expression.
il est interdit de prendre l'adresse d'un rvalue, pas un temporaire spécifiquement. c'est pourquoi c'est interdit; 'A()' renvoie un rvalue. –
@underscore_d Vrai - J'ai utilisé le terme informel 'temporaire', plus précisément une variable temporaire sans nom, et, comme vous le dites à juste titre, une valeur rvalue. Si nous sommes pointilleux, 'A()' ne retourne pas un rvalue (les constructeurs n'ont pas de valeurs de retour), c'est une expression prvalue. –
Bonne prise - il est trop facile de considérer réflexivement les constructeurs comme des appels de fonction. –