C
Weil das Argument orin in fkt_ref kein temporäres Objekt ist. "Temporär" ist keine Eigenschaft eines Objektes als solches, sondern bezieht sich immer nur auf den Kontext, in dem das Objekt erstellt wurde. ich hab ein paar Jahre gebraucht, bis ich das wirklich verstanden hatte, dass die Begrifflichkeiten etwas verwirrend sind, kann ich also nachvollziehen.
struct foo{};
foo bar()
{
return std::move(foo()); // Move-Konstruktion kann nicht eliminiert werden, obwohl wir wissen, dass das Ergebnis von move auf ein temporäres Objekt verweist.
}
Definitionen im Standard haben nicht immer die Form
An X is ...
Zum Beispiel
n3337 schrieb:
3 Basic concepts [basic]
/6
A variable is introduced by the declaration of a reference other than a non-static data member or of an
object. The variable’s name denotes the reference or object.
Das ist auch eine Begriffsdefinition.
Für temporäre Objekte haben wir
n3337 schrieb:
12.2 Temporary objects [class.temporary]
Temporaries of class type are created in various contexts: binding a reference to a prvalue (8.5.3), returning
a prvalue (6.6.3), a conversion that creates a prvalue (4.1, 5.2.9, 5.2.11, 5.4), throwing an exception (15.1),
entering a handler (15.3), and in some initializations (8.5).
Und auch hier ist das nicht einfach nur eine Beschreibung, wann temporäre Objekte entstehen, sondern was sie überhaupt sind.