Was ist der Zweck eines Platzhaltertyps in einem Trailing-Return-Typ?

Was ist der Zweck eines Platzhaltertyps in einem Trailing-Return-Typ?

Sie können sich über die Konsistenz streiten:Sie können andere Typen als nachgestellte Rückgabetypen einfügen, warum nicht Platzhalter?

auto f() -> int&  { return i; }
auto f() -> auto& { return i; }

Sie können sich über die Nützlichkeit streiten:Der Rückgabetyp für Lambdas sieht aus wie ein nachgestellter Rückgabetyp und hat keinen anderen Platz, um einen Platzhaltertyp zu platzieren, also müssen Sie ihn trotzdem für Lambdas zulassen, also könnten Sie ihn genauso gut für Funktionen zulassen?

auto f = []() -> int&  { return i; };
auto f = []() -> auto& { return i; };

Sie können sich über die Codeformatierung streiten. Der abschließende Rückgabetyp ermöglicht eine konsistente Möglichkeit, Funktionen zu deklarieren, die immer für alle Fälle funktionieren, also reihen Sie sie einfach aneinander:

auto g(auto x)     -> decltype(f(x)) { ... } // using trailing for parameter
auto Cls::member() -> type { ... }  // using trailing for scope (to find Cls::type)
auto h(auto x)     -> auto& { ... }  // using trailing for formatting

Vielleicht gibt es noch andere Argumente. Aber kurz gesagt, es ist einfach zuzulassen und hat eindeutig seine Berechtigung.


Die Antwort finden Sie in der Revision N3582 (2013-03-15) 1 zum ursprünglichen Vorschlag für auto :

(Denken Sie daran, dass nicht nur Funktionen, sondern auch Lambdas einen trailing-return-type haben können )

Daher [dcl.spec.auto]/2:

1 Hinweis:N3582 wurde durch N3638 ersetzt, bevor es tatsächlich übernommen wurde.