Warum gibt es in C ++ 11 / C ++ 14 eine spezielle Typabzugsregel für automatische und geschweifte Initialisierer?

In seinem CppCon 2014 Talke "Typabzug und warum Sie sich interessieren", Scott Meyers wirft die Frage auf, warum es eine Sonderregel für @ gibauto und geschweifte Initialisierer im C ++ 11 / C ++ 14-Standard (seine Frage beginntat 36m05s).

Die Semantik von auto in Kombination mit einer geschweiften Init-Liste ist in §7.1.6.4 / 6 definiert.

Ich habe darüber nachgedacht und konnte mir auch keinen Use-Case einfallen lassen. Das Nächste, was ich bisher gesehen habe, ist ein Beispiel, in dem Bjarne Stroustrup es verwendet hat.

In seinemCpp 2014 talk "Machen Sie einfache Aufgaben einfach!", er benutzt einmalauto zum Erfassen von Initialisierern (jedoch nur zur Umgehung).

Hier ist der Code (Teil von Folie 30,at 37m10s):

    // auto ss1 = collect({ 1, 2, 3, 4, 5, 6 }, odd); // error: Bummer!
    auto lst = { 1, 2, 3, 4, 5, 6 };
    auto ss2 = collect(lst, odd);    // {1,3,5}

Bitte beachten Sie, dass dies nur eine Problemumgehung ist. Er erwähnte, dass es nicht notwendig sein sollte. Stattdessen würde er es vorziehen, die Argumente direkt an die Funktion zu übergeben. Es kann also nicht wirklich eine gute Motivation für @ seiauto und Initialisierungslisten.

Mein Verständnis von C ++ ist nicht tief genug, um die Nachteile des Erlaubens von Initialisierungslisten in Bjarnes Beispiel zu beurteilen, wie er vorschlägt. Wie auch immer, es würde die Notwendigkeit für @ vermeidauto In diesem Fall

So, istauto und Initialisierungsliste nur eine Problemumgehung für etwas, das hätte besser gelöst werden können? Oder gibt es gute Beispiele, bei denen die zusätzliche automatische Abzugsregel in §7.1.6.4 / 6 nützlich ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage