Frage

mmm, ich habe nur eine wenig Verwirrung über mehr Autos Erklärungen in dem kommenden C ++ 0x-Standard.

auto a = 10, b = 3.f , * c = new Class();

irgendwo habe ich gelesen, es ist nicht erlaubt. Der Grund dafür war (?), Weil nicht klar war, ob die aufeinanderfolgenden Erklärungen sollten die gleiche Art von dem ersten haben, (int im Beispiel), oder nicht.

Mögliche Übersetzung 1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();

verursacht einen Fehler

Mögliche Übersetzung 2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 

, wie es in der Norm geführt wird?

Wenn ich meine POV sagen kann, 2 Übersetzung # war die obiouvs, zumindest für mich, dass ich ein regelmäßiger C ++ Benutzer. Ich meine, für mich „jede Variable gleichen deklarierten Typ deklariert ist“, ist Hexe Auto. Übersetzung # 1 wäre wirklich un-intuitiv mir.

Good Bye QbProg

War es hilfreich?

Lösung

Es ist wahrscheinlich nicht die neuesten, aber meine C ++ 0x Norm-Entwurf vom Juni 2008 sagt, dass Sie Folgendes ausführen können:

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int

Also, wenn etwas von Juni geändert hat dies (oder wird) mit einer recht intuitiven Interpretation in einer begrenzten Form erlaubt.

Die Einschränkung ist, dass, wenn Sie mehr Autos Erklärungen wie diese Zeichenfolge wollen tun (das obige Beispiel verwendet wird), es funktioniert, weil die abgeleitete Art von v und u den gleichen ‚Basistyp‘ hat (int in diesem Fall) zu verwenden, ein ungenauer Begriff.

Wenn Sie die genaue Regel wollen, Der Norm-Entwurf sagt dieser:

  

Wenn die Liste der Deklaratoren mehr als ein declarator enthält, wird der Typ jeder deklarierte Variable bestimmt, wie beschrieben   über. Wenn der Typ für die Template-Parameter abgeleitet U nicht das gleiche in jedem Abzug ist, ist das Programm schlecht ausgebildet ist.

, wo der "abgeleitete Template-Parameter U" wird bestimmt durch:

  

der abgeleitete Typ des Parameters u im Aufruf f (ausdr) der folgenden erfundenen Funktionsvorlage:

 `template <class U> void f(const U& u);`

Warum haben sie stattdessen mit dieser Regel kommen zu sagen, so etwas wie:

auto a = 10, b = 3.f , * c = new Class();

entspricht:

auto a = 10;
auto b = 3.f;
auto * c = new Class();

Ich weiß es nicht. Aber ich schreibe nicht Compiler. Wahrscheinlich mit etwas zu tun, wenn man dachte, habe aus der das auto Schlüsselwort ersetzt, können Sie es nicht ändern, in der gleichen Aussage.

Nehmen Sie zum Beispiel:

int x = 5;
CFoo * c = new CFoo();

auto  a1 = x,       b1 = c; // why should this be permitted if
int   a2 = x, CFoo* b2 = c; // this is not?

Auf jeden Fall, ich bin kein Fan von ohnehin mehrere Erklärungen auf der gleichen Aussage setzen.

Andere Tipps

Es gibt einige Punkte, die ich denke Hilfe der aktuellen Formulierung beitragen. Die erste ist die Konsistenz. Wenn Sie schreiben eine Erklärung wie:

int j;
int i = 0, *k = &j;

Dann werden die beiden Typen verwenden beide int irgendwo in ihrer Art. Es ist ein Fehler zum Beispiel, wenn ‚j‘ a ‚const int‘ ist. Mit Auto die gleiche Arbeit ist „konsistent“ mit dem aktuellen Modell für solche Erklärungen.

Es gibt dann einen praktischen Vorteil aus Sicht der Compiler Schriftsteller. Es gibt bereits die Maschinen in Compiler Typ Abzug für einen Funktionsaufruf (das ist, wie Auto wird beschrieben als Betrieb) auszuführen. Die obige Regel steht im Einklang mit der Regel, dass Abzug für einen Template-Parameter in der gleichen Art führen muß:

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

Eine einfache Implementierung für Auto ist, die bestehenden Mechanik wieder zu verwenden, die Art abzuleiten für Auto , und wegen der Übereinstimmung mit dem geltenden Verhaltensweisen das Ergebnis wird nicht allzu überraschend sein zu den Menschen.

Schließlich, und dies ist wahrscheinlich der wichtigste Punkt in meiner Meinung nach. Das aktuelle Modell ist konservativ und arbeitet sehr ähnlich wie bestehende Sprachkonstrukte in C ++. Deshalb sind die Chancen, dass es in einer Show Stopp Sprache Fehler resultieren, sind sehr gering. Jedoch kann das aktuelle Modell leicht in Zukunft weiter ausgebaut werden, um die weiteren Beispiele enthalten, die Sie in Ihrer Frage Liste.

Was mehr ist, wird diese Erweiterung nicht Code brechen, der den aktuellen Wortlaut von verwendet auto . Überlegen Sie, ob sie in dieser Runde die andere Art und Weise tat. Wenn die erweiterte Version von Auto war die erste Version, und dies führte zu einigen seltsamen und fatale Fehler mit dem Schlüsselwort dann wäre es das Entfernen einer Sprache-Funktion aus dem Standard benötigen - etwas, das so gut wie nie passiert, als es sehr wahrscheinlich, bricht Code.

Die erste wäre der Art Linie mit wie Typinferenz arbeitet in der Rückgabetyp der:. Operator

scroll top