In this answer Ich schrieb den C++ 17-Code decltype:Gibt es eine Verknüpfung
cout << accumulate(cbegin(numbers), cend(numbers), decay_t<decltype(numbers[0])>{});
Dieser einige negative Kommentare über die Natur der C++ 's Typzuordnung erhalten, die ich traurig zu sagen bin, dass ich zustimmen mit :(
decay_t<decltype(numbers[0])>{}
ist eine sehr komplexe Art und Weise ein zu bekommen:
Zero-initialized type of an element of
numbers
ist es möglich beizubehalten, um die Verbindung mit der Art der numbers
' Elemente, aber nicht wie 30 Zeichen, um es zu bekommen?
EDIT:
Ich habe eine Menge Antworten bekam die einen Wrapper für entweder accumulate
oder zum Extrahieren des Typs von numbers[0]
beteiligt sind. Das Problem besteht darin, dass der Leser zu einem sekundären Standort navigieren muss, um eine Lösung zu lesen, die nicht weniger komplex ist als der Initialisierungscode decay_t<decltype(numbers[0])>{}
.
Der einzige Grund, dass wir mehr als dies zu tun: decltype(numbers[0])
ist, weil die array subscript operator einen Verweis zurückgibt:
error: invalid cast of an rvalue expression of type 'int' to type 'int&'
Es ist interessant, dass in Bezug auf decltype
‚Argument:
If the name of an object is parenthesized, it is treated as an ordinary lvalue expression
Jedoch ist decltype((numbers[0]))
immer noch nur ein Verweis auf ein Element von numbers
. Also am Ende diese Antworten können so nah wie wir zur Vereinfachung diese Initialisierung kommen kann :(
verwenden würden, wenn Sie eine Null wollen, schreiben Sie es einfach so nach unten: 0. Es gibt keine ist müssen Pilion auf Ossa stapeln. –
@ n.m. Das ist absolut falsch, mein Herr. Eine '0' wird 'accumulate'' init' als 'int' definieren. Wenn wir zum Beispiel mit 'float numbers []' arbeiten, werden die Werte abgeschnitten. [Dieses Beispiel] (http://ideone.com/A12xin) sollte beispielsweise 11.2 ausgeben, aber wenn ich eine "0" verwende, wird 10 ausgegeben. –
Ja, Sie haben Recht. Ich habe std vergessen: accumulate is broken ... –