Extension de durée de vie temporaire et conversion implicite en référence const

Oct 06 2020

Normalement, la liaison d'un temporaire à un local const&prolonge la durée de vie du temporaire jusqu'à la fin de la portée de la référence:

struct Foo { void DoSomething() const; };
Foo Make();

const Foo& foo = Make(); // compiles
foo.DoSomething(); // ok, lifetime of foo was extended

Mais lorsqu'une conversion implicite est impliquée, ce n'est plus le cas:

struct Foo { void DoSomething(); };
struct Bar { operator const Foo&() const; };
Bar Make();

const Foo& foo = Make(); // compiles calling the implicit conversion operator
foo.DoSomething(); // not ok, temporary Bar has been destroyed

Est-ce vraiment ce qui est spécifié dans la norme C ++? Est-ce voulu? Est-il légal de déclarer de tels opérateurs de conversion implicites en a const&? ( Une autre question est de savoir comment cet opérateur de conversion doit être mis en œuvre. Dans ce cas, il faudrait impliquer un reinterpret_castse fondant sur Fooet Barayant une représentation binaire compatible, ce qui est probablement un comportement non défini. En C ++ 20, probablement bit_castpeut - être utilisé? Mais supposons que Foodérivé de Bar, a static_castpourrait être utilisé, supprimant le comportement indéfini et la situation ne change pas)

Réponses

songyuanyao Oct 06 2020 at 14:25

Est-ce voulu?

Oui. La durée de vie du temporaire Barne sera pas étendue à la durée de vie de foo.

En général, la durée de vie d'un temporaire ne peut pas être prolongée davantage en "le transmettant": une deuxième référence, initialisée à partir de la référence à laquelle le temporaire était lié, n'affecte pas sa durée de vie.

Cela signifie que la durée de vie de la liaison temporaire à référence directe serait prolongée. Dans ce cas, le temporaire Barrenvoyé par Make()n'est pas lié foodirectement.