In seiner CppCon 2014 talke "Type Deduction and Why You Care" wirft Scott Meyers die Frage auf, warum es eine spezielle Regel über und starre Initialisierer im C++ 11/C++ 14 Standard gibt (seine Frage beginnt at 36m05s).Warum gibt es in C++ 11/C++ 14 eine spezielle Typableitungsregel für Auto und Brained-Initialisierer?
Die Semantik von Auto in Kombination mit einer Braced-Init-Liste ist in §7.1.6.4/6 definiert.
Ich dachte darüber nach und konnte auch keinen Anwendungsfall finden. Das Nächste, was ich bisher gesehen habe, ist ein Beispiel, wo Bjarne Stroustrup es benutzt hat.
In seinem Cpp 2014 talk "Make Simple Tasks Simple!" verwendet er einmal auto
, um Initialisierer zu erfassen (aber nur als Workaround).
Hier ist der Code (Teil des Schlittens 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}
Aber beachten Sie, dass es nur eine Abhilfe ist. Er erwähnte, dass es nicht notwendig sein sollte. Stattdessen würde er es vorziehen, die Argumente direkt an die Funktion zu übergeben. Also kann es nicht wirklich als eine gute Motivation für auto
und Initialisierungslisten dienen.
Mein Verständnis von C++ ist nicht tief genug, um die Nachteile des damit initializer-Listen in Bjarne Beispiel zu beurteilen, wie er vorschlägt. Jedenfalls würde es in diesem Fall die Notwendigkeit für auto
vermeiden.
Also, ist auto
und Initialisierungsliste nur ein Workaround für etwas, das besser hätte gelöst werden können? Oder gibt es gute Beispiele, wo die Regel für den zusätzlichen automatischen Abzug in §7.1.6.4/6 nützlich ist?
Ich bin mir ziemlich sicher, dass es einen C++ 1z-Vorschlag gibt, um 'auto x = {expr};' den Typ von 'expr' zu verwenden (minus einen nicht eingeklammerten Komma-Operator). Ich bin mir nicht sicher, welchen anderen Typ ich für eine vollständige Liste verwenden soll. – chris
@christ Ich denke du meinst N3922. Scott Meyers erwähnt das auch. Visual Studio implementiert es bereits, obwohl es nicht Teil von C++ 14 ist. Hier ist der Link: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3922.html –
Ah, das ist der eine. Obwohl ich * irgendwie * mit dem allgemeinen aufgrund dieser Verwendung nicht einverstanden bin. Ich würde es wirklich vorziehen, dass sie schlecht gebildet sind und Initialisierungslisten in Funktionen ohne die zusätzliche Zeile übertragen werden können. – chris