2016-12-26 3 views
22

Warumdecltype abgezogen Ergebnis der in-Klasse definierte Funktion

struct MyStruct { 
    auto foo() { return 1; } 
    auto bar() { return foo(); } 
}; 

Kompilierung, aber wenn, wie so einen Hinterrückgabetyp mit:

struct MyStruct { 
    auto foo() { return 1; } 
    auto bar() -> decltype(foo()) { return foo(); } 
}; 

Kompilation nicht mit

error: function 'foo' with deduced return type cannot be used before it is defined

Ist das korrektes Verhalten bei den Implementierungen?

+6

Ja. Die Memberfunktionskörper folgen logisch der Klassendefinition, selbst wenn sie inline definiert sind. –

+0

Nun, wenn Sie einfache 'Auto'-Abzug auf den Rückgabetyp von' foo' verwenden können, warum nicht auch für 'bar' verwenden? – StoryTeller

+0

Ich sehe den Punkt von 'declltype' nicht. Fehle ich etwas? Suchen Sie nach 'auto & foo() {return i; } auto bar() -> decltype (automatisch) {return foo(); } '? – ZDF

Antwort

11

Im ersten Schnipsel können wir den (effektiven) Rückgabetyp ableiten, weil die Definition in diesem lexikalischen Punkt — vorgesehen ist, und umgekehrt nicht, wenn the definitions are lexically swapped, die mit [dcl.spec.auto]/10 unisono ist arbeiten, da wir zyklischen Abzug nicht zulassen müssen .

das zweite Schnipsel, siehe core issue 945, die core issue 643 und beschäftigt sich mit this werden in Hinterrückgabetypen effektiv wieder geöffnet verwendet, in denen der Klassentyp noch nicht abgeschlossen ist. AFAICS, der aktuelle Wortlaut erlaubt es in der gleichen Weise wie im ersten Fall (wieder in der richtigen Reihenfolge der Definitionen), aber behalten Sie die offene Frage 1890 vor Augen; Anbieter verzögern die Implementierung von fragwürdigem Zeug bis bestätigt.

+0

Es scheint mir, dass [CWG1890] (http://wg21.link/cwg1890) für dieses Problem relevant ist. – bogdan

+0

@bogdan Ich bin etwas verwirrt, weil ich der Meinung bin, dass der Code überhaupt nicht schlecht formuliert sein sollte, d. H. Wenn der aktuelle Wortlaut mehr verbietet, als er sein sollte. – Columbo

+0

@bogdan CWG1890 ist über Arten von Daten Mitgliedern. Die Frage betrifft eine Funktionsdeklaration. Wie ist es relevant? Nur Neugier, keine Kritik. – skypjack