Erlaubt C ++ 0x declltype () in der Funktionssignatur?

8

Diese Frage setzt natürlich voraus, dass wir keine Vorlagen für diesen Typ verwenden wollen (aus welchen Gründen auch immer).

%Vor%

Die Frage ist: sind 1. und 2. erlaubt und möglich (oder sogar speziell definiert) in C ++ 0x?

    
Klaim 31.01.2011, 10:01
quelle

4 Antworten

7

Alles, was Sie tun müssen, ist mPrice und mLabel zu deklarieren, bevor Sie decltype verwenden:

%Vor%

Dies kompiliert gut unter g ++ 4.4 mit -std = c ++ 0x.

Bearbeiten Der Punkt ist, dass der Compiler beim ersten Durchlauf Funktionsdeklarationen parsen muss. Der Rumpf einer Memberfunktion kann kompiliert werden, nachdem die Memberdeklarationen analysiert wurden, aber die Memberdeklarationen selbst müssen sofort verständlich sein - sonst beginnt der schlechte Compiler?

Also muss der Typ jedes Mitgliedsfunktionsarguments bekannt sein, sobald es gefunden wird.

    
TonyK 31.01.2011, 11:29
quelle
8

Ja, aber mit einer anderen Syntax:

%Vor%

Allgemeiner:

%Vor%

function Rückgabetyp ist der Typ von EXPRESSION

BEARBEITEN

über den Fall 1 Ich bin mir nicht sicher. Ich glaube nicht, dass es gültig ist, denn ich denke nicht, dass mPrice ein gültiger Ausdruck in einem solchen Kontext ist: Sie verwenden einen nicht statischen Funktionsmember ( Product::mPrime ) ohne ein Objekt.

Meine Vermutung ist auch, dass, wenn mPrime ein statisches Mitglied wäre, es funktionieren würde.

    
peoro 31.01.2011 10:02
quelle
2

vc ++ 2010 kompiliert diese w / o-Fehler:

%Vor%

Aber wenn ich Dummy-Standardparameter aus Methodendeklarationen entferne, wird der Fehler erneut angezeigt. declltype in return type funktioniert nur, wenn es auch in einem Funktionsparameter (???) erscheint

(Entschuldigung, ich verstehe, dass es ein Kommentar sein sollte, aber es scheint interessant und es ist nicht bequem, Code in Kommentare zu schreiben)

    
user396672 31.01.2011 11:40
quelle
1

AFAIK das ist nicht legal, da die Instanzvariablen an den Punkten, an denen Sie sie verwenden, nicht im Geltungsbereich sind.

Überlegen Sie, was passieren würde, wenn Sie vor Ihrer Klasse die folgenden Variablen deklariert hätten:

%Vor%

In der Funktion declleration würde mPrice eher an die globale Variable als an das Instanzelement binden.

Sowohl g ++ 4.5 als auch VS10 weigern sich, Ihren Code zu kompilieren, da mPrice und mLabel außerhalb des Gültigkeitsbereichs liegen.

Dies scheint jedoch nicht mit den Standardparametern übereinzustimmen.

%Vor%

Das gibt mir einen Kompilierungsfehler:

  

ungültige Verwendung des nicht statischen Datenmembers 'Product :: mPrice'

    
Motti 31.01.2011 10:13
quelle

Tags und Links