Die Konstruktion von temporär im Funktionsaufruf wird als Deklaration interpretiert

8

In letzter Zeit bin ich auf ein Problem gestoßen, das irgendwie (aber nur irgendwie) für mich Sinn macht. Es basiert auf der Interpretation der Konstruktion eines temporären als Deklaration des einzelnen (!) Konstruktorarguments. Bitte schauen Sie sich das folgende Minimalbeispiel an.

%Vor%

Ich habe diese Ausdrücke schon gelesen:

%Vor%

Wird interpretiert (wenn es einen Standardkonstruktor gibt) als Deklaration von a. Dies ist sinnvoll und völlig in Ordnung, da Sie einfach die {} - Klammern verwenden können, um die Konstruktion explizit zu machen. Aber was ich nicht verstehe, ist:

  1. Warum gibt es ein Problem mit der Konstruktion von bar0? Alle Foo s haben keinen Standardkonstruktor. Es ist also nicht sinnvoll, etwas wie Foo0(x) als Deklaration von x zu interpretieren.

  2. Warum funktioniert die Konstruktion von bar1 und bar2 ? Es ist für mich offensichtlich, dass die Konstruktion von bar4 funktioniert, da ich die {} -Halterungen für alle temporären Foo s verwende, so dass ich explizit darlege, was ich will.

  3. Wenn es nur notwendig ist, die {} - Klammern mit nur einer der Foo s zu verwenden, um das Problem zu lösen ... warum schlägt die Konstruktion von bar3 fehl?

  4. Außerdem wird x deklariert, bevor ein Balken erstellt wird. Warum beschwert sich der Compiler nicht darüber?

Die letzte Frage bezieht sich auf meine letzte Codezeile. Lange Rede, kurzer Sinn: Was denkt der Compiler, dass ich ihn machen soll und wo vermisse ich das Auftreten von Shadowing?

PS: Wenn es von Interesse ist - verwende ich die gcc-4.9.2.
PPS: Ich habe das gleiche mit dem% constructor von bar versucht und nehme drei Foo0 s als Argumente. Die gleiche Geschichte hier. Aber der Fehler sagt nichts über widersprüchliche Deklaration, sondern über die Neudefinition von x .

    
sedriel 19.01.2015, 22:40
quelle

2 Antworten

10

Die Regel besagt, dass wenn eine Deklaration die Syntax einer Funktionsdeklaration hat, diese eine ist; Ansonsten ist es eine Variablendeklaration. Überraschende Beispiele dafür werden manchmal .

%Vor%

Dies ist eine Funktionsdeklaration: bar0 ist der Name, Bar ist der Rückgabetyp und die Parametertypen sind Foo0 , Foo1 und Foo2 . Die Parameternamen sind alle x , was illegal ist - die Namen der Funktionsparameter müssen unterschiedlich sein. Wenn Sie x x x auf x y z ändern, verschwindet der Fehler).

%Vor%

Diese Zeilen und die Objekte bar1 , bar2 und bar4 des Typs Bar erstellen. Sie können nicht als Funktionsdeklarationen analysiert werden, da die { } -Notation keine gültige Syntax in einer Funktionsdeklaration ist.

Daher sind Foo0{x} usw. Ausdrücke, die die Argumente für den Konstruktor von Bar liefern. Foo0{x} und Foo0(x) sind gleichwertige Möglichkeiten, einen temporären Typ Foo0 mit dem Initialisierer x zu deklarieren.

%Vor%

Ich denke, das ist ein Compiler Bug; Der Teil Foo2{x} bedeutet, dass diese Zeile keine Funktionsdeklaration sein darf; und es sieht wie eine gültige Deklaration einer Variablen bar3 aus.

%Vor%

x ist ein int ; Es hat keine Methoden.

    
M.M 19.01.2015, 23:46
quelle
2

1) Foo0 (x) wird in diesem Fall als Parameter der Funktion bar0 behandelt. Hier spielt es keine Rolle, ob es einen Standardkonstruktor hat oder nicht. Es ist keine lokale Variablendeklaration und Initialisierung, sondern nur eine Parameterdeklaration in einer Funktionsdeklaration.

2) Ich vermute, das hat etwas mit dem Parsen zu tun, aber jemand korrigiert mich, wenn ich falsch liege. Die Beispiele bar1 und bar2 funktionieren, weil der Compiler weiß, dass bar1 und bar2 lokale Variablendeklarationen sind (und nicht funktionieren) Deklarationen), sobald das erste Vorkommen von {} angezeigt wird. Diese ersten Vorkommen von {} erscheinen, bevor x zweimal als Parameter der Funktion deklariert wird.

3) Die Konstruktion von bar3 schlägt fehl, weil der Compiler zuerst annimmt, dass bar3 eine Funktionsdeklaration ist. Die Funktionsdeklaration benötigt drei Parameter, die alle den Namen x haben. Offensichtlich ist das nicht korrekt.

4) Das x in der Funktionsdeklaration ist nur ein Name für den Parameter. Es ist in einem anderen Bereich als die Ganzzahl x, die Sie zuvor deklariert haben.

    
fvannee 19.01.2015 22:54
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer17282661 ___

Nun, der erste Ort, an dem Sie suchen sollten, ist die Google-Geochart-API, die Sie hier finden: Ссылка

Beachten Sie das Optionsobjekt. Geben Sie ihr eine Eigenschaft der Region "USA" und eine Auflösung der "Provinzen". Etwas wie das:

%Vor%

Nun werden Sie die Zustände bekommen, aber sie werden sie nicht färben. Dazu müssen Sie für jeden Status Werte festlegen. Mach es so:

%Vor%

Der erste Wert ist der Status und der zweite Wert ist der Wert, den er zum Färben trägt. Um die gewünschte Farbgebung zu erhalten, müssen Sie die Daten ein wenig massieren und dann den gewünschten Farbbereich einstellen.

%Vor%

Rufen Sie das Diagrammobjekt ab und übergeben Sie das Array state_value_array an das ArrayToDataTable-Objekt, und alles sollte in Ordnung sein.

    
___ answer17290616 ___

Um die Regionsfarbe für jeden Zustand als das untenstehende Bild festzulegen, müssen Sie die Farbeneigenschaft im Optionsobjekt verwenden. Versuchen Sie dies unter dem Code

%Vor%

Sehen Sie sich diese jqfaq.com das hat eine funktionierende Probe

    
___ tag123googlevisualisierung ___ Die Google Visualization API ermöglicht die Erstellung von SVG-, Flash- und Bilddiagrammen und Dashboards basierend auf Daten aus verschiedenen Quellen. Die Diagramme / Dashboards können interaktiv sein, automatisch aktualisiert werden und auf Webseiten und Webanwendungen enthalten sein. ___ answer17299415 ___

Ich habe in der Vergangenheit auch eine "politische" Karte mit der Google Geochart API erstellt. Hier ist der Code, den ich für die USA verwendet habe:

%Vor%

So sieht die Karte aus:

Sie können es in Live-Action hier auf meiner Website sehen, zusammen mit anderen Geochart-Kartenbeispielen mit Codes: Ссылка

    
___ qstntxt ___

Ich möchte die Region Farbe für jeden Staat in den Vereinigten Staaten wie im Bild festlegen? ist es möglich in geochart?

Bitte leiten Sie mich dazu.

Danke und Grüße, Ranjith Kumar.

    
___