Warum Array-Größe angeben bei neuer new[]{} Syntax?
-
314159265358979 schrieb:
Da wird das dritte Element default-konstruiert. Ich verstehe nicht, worauf du hinaus willst.
Ohne Großenangabe würde es aber ein Zwei-elementiges Array sein, anstatt eines Drei-elementiges Array. Große des Array != Große der Initializer (Kein Ahnung wie Standardkonform heißt).
-
Ja und? Das ist doch genau das was ich möchte, wenn ich 2 Initializer angebe und keine Größe. Wenn ich es größer haben möchte, gebe ich eben eine an.
-
Zeus schrieb:
314159265358979 schrieb:
Da wird das dritte Element default-konstruiert. Ich verstehe nicht, worauf du hinaus willst.
Ohne Großenangabe würde es aber ein Zwei-elementiges Array sein, anstatt eines Drei-elementiges Array. Große des Array != Große der Initializer (Kein Ahnung wie Standardkonform heißt).
Und? Es spricht doch nichts dagegen, dass man in dem Fall die Größe mit angibt. Wenn man aber drei Elemente haben will, und deren Werte kennt? Dann wäre es doch praktisch, wenn man es machen könnte, wie pi es zeigt. Zumal es ja auch bei statischen Arrays geht. Wozu der Sonderfall? Ich finde die Frage durchaus berechtigt.
-
Zeus schrieb:
Ohne Großenangabe würde es aber ein Zwei-elementiges Array sein, anstatt eines Drei-elementiges Array.
Ich versteh schon, warum Pi hier ständig ausflippt.
-
Ich könnte mir vorstellen dass man einfach die syntaktische Mehrdeutigkeit mit Lambdas vermeiden wollte.
-
Ich könnte mir vorstellen, dass man es für einen hinreichend seltenen Anwendungsfall gehalten hat, um sich nicht weiter darum zu kümmern. Wenn man Arrays mit new[] erstellt, tut man das ja in aller Regel nur, weil man die Länge zur Compilezeit nicht kennt und diese Schreibweise eh nicht benutzen kann.
-
Hmm... syntaktische Mehrdeutigkeit? Also ich erwarte hinter
neweinen Objekttypen. Aber das ist jetzt auch nicht mein Spezialgebiet. Möglicherweise hat man einfach eine entsprechende Regel vergessen und nicht so weit gedacht.
-
krümelkacker schrieb:
Hmm... syntaktische Mehrdeutigkeit? Also ich erwarte hinter
neweinen Objekttypen. Aber das ist jetzt auch nicht mein Spezialgebiet. Möglicherweise hat man einfach eine entsprechende Regel vergessen und nicht so weit gedacht.Ein
int []{}wäre ein Lambda das nichts captured und nichts tut
Aber die Tatsache dass man mit new erzeuge Arrays in der Regel sowieso nicht initialisieren kann, gibt imo fast noch die bessere Erklärung ab...
-
dot schrieb:
Ein
int []{}wäre ein Lambda das nichts captured und nichts tut
Äh, was? Den Rückgabetyp gibt man bei Lambdas doch mit -> an. Eine Prä-Schreibweise wäre mir neu.
dot schrieb:
Aber die Tatsache dass man mit new erzeuge Arrays in der Regel sowieso nicht initialisieren kann, gibt imo fast noch die bessere Erklärung ab...
?
-
Kann sein, dass ich voellig falsch liege, aber funktioneirt das nicht auch?
struct Object{ Object(int, int){} Object(int){} }; //spaeter Object* obj = new Object{int,int};//array von 2 Object oder 1 Object?hab keine Ahnung von C++11, aber wenn das so ginge, dann waere das eine Erklaerung fuer die Einschraenkung.
-
dot schrieb:
krümelkacker schrieb:
Hmm... syntaktische Mehrdeutigkeit? Also ich erwarte hinter
neweinen Objekttypen. Aber das ist jetzt auch nicht mein Spezialgebiet. Möglicherweise hat man einfach eine entsprechende Regel vergessen und nicht so weit gedacht.Ein
int []{}wäre ein Lambda das nichts captured und nichts tut
Die Maximum-munch-regel für new-Deklaratoren sollte hier Mehrdeutigkeiten verhindern (lasse mich nat. gerne von einem Gegenbeispiel überzeugen).
Nach kurzem Überfliegen von einigen Proposals zur Initilisierungssyntax komme ich zu folgenden Schlussfolgerungen:
1. Eine solche Spracherweiterunng (der Form new foo[]{ ... }) dürfte ohne Probleme möglich sein,
2. Diese Möglichkeit dieser Form ist nicht Gegenstand der uniformen Initiliasierung - dort geht es darum, deklarierte/definierte Objekte einheitlich zu Initialisieren. Beim Vorschlag hier geht es dagegen darum, aus der neuen Syntax heraus eine zusätzliche Form der Deklaration (auslassen des Ausdrucks in den []-Klammern) zu ermöglichen. Das Problem ist also eher mit der neuen auto-Semantik verwandt.
3. Soweit ersichtlich, wurde kein solcher Vorschlag an das Standardkomittee herangetragen oder aber nicht für wichtig genug gehalten.
Der praktische Nutzen ist ja begrenzt: da in diesem Fall die Größe des Arrays bereits beim Compilieren feststeht, wird man i.d.R. sowieso nicht new gebrauchen, oder aber kann ohne nennenswerten Overhead einen Container benutzen. Und in generischem Code sollte es für gewöhnlich leicht sein, die Anzahl der Elemente zu ermitteln, so dass dort die explizite Angabe kein großes Hindernis darstellt.