Perfekte Weiterleitung eines Rückgabewertes mit auto&&

Perfekte Weiterleitung eines Rückgabewertes mit auto&&

Hier gibt es zwei Abzüge. Eine aus dem Rückgabeausdruck und eine aus std::invoke Ausdruck. Weil decltype(auto) als der deklarierte Typ für den ungeklammerten ID-Ausdruck abgeleitet wird, können wir uns auf die Ableitung von std::invoke konzentrieren Ausdruck.

Zitiert aus [dcl.type.auto.deduct] Absatz 5:

Und zitiert aus [dcl.type.simple] Absatz 4:

Beachten Sie decltype(e) wird zu T abgeleitet statt T&& wenn e ist ein PR-Wert. Dies ist der Unterschied zu auto&& .

Also wenn std::invoke(std::forward<Callable>(op), std::forward<Args>(args)...) ist ein Prvalue, zum Beispiel der Rückgabetyp von Callable ist keine Referenz, d. h. Rückgabe nach Wert, ret wird anstelle einer Referenz als derselbe Typ abgeleitet, was die Semantik der Rückgabe nach Wert perfekt weiterleitet.


Nein.

Teil von decltype(auto) Die Magie von ist, dass es ret kennt ist ein lvalue, also bildet es keine Referenz.

Wenn Sie return (ret) geschrieben hätten , wäre es tatsächlich in einen Referenztyp aufgelöst worden und Sie würden eine Referenz auf eine lokale Variable zurückgeben.

tl;dr:decltype(auto) ist nicht immer dasselbe wie auto&& .