2013-05-27 7 views
9

das Betrachten following code:decltype in Klassenmethode Erklärung: Fehler, wenn vor "referenziert" Element verwendet wird erklärt

struct test {  
    auto func() -> decltype(data) {} // ERROR 

    int data; 
}; 

int main() { 
    test t; 
    t.func(); 
} 

Es gibt den folgenden Fehler:

main.cpp:2:29: error: 'data' was not declared in this scope 
    auto func() -> decltype(data) {} 

Wenn ich jedoch data oben platzieren func(), gibt es keinen Fehler aus (live code):

struct test {  
    int data; 

    auto func() -> decltype(data) {} 
}; 

... 

Und so ist meine Frage, warum ist decltype Mitglieder nicht nach ihm deklariert (wenn decltype in einer Methodendeklaration verwendet wird, nicht in der Definition)? Ich möchte auch wissen, ob sich dieses Verhalten in zukünftigen Iterationen des Sprachstandards ändert.


Bitte beachten Sie, dass ich dies frage, weil ich decltype erwartete sich anders zu verhalten. Meine Codierungskonvention besteht darin, Klassendatenelemente unterhalb der Klassenfunktionen zu platzieren. Sicher würde dieses unterschiedliche Verhalten beeinflussen, wie ich meine Klassenmitglieder organisiere. Ich wäre sehr dankbar, wenn Sie mir einen Workaround zur Verfügung stellen könnten, der meine Codierungskonventionen beibehalten würde.

+0

Sorry - die Art von C++, geerbt von C –

+0

Es ist nicht nur 'declltype', auch ein einfaches' typedef' zeigt das [gleiche Verhalten] (http://coliru.stacked-crooked.com/view?id=8f959fbd70b0b7d44c21ff0d71967fd5-6f7ec8a47f20223a17b26973b6e13527). Durch das Verschieben des 'typedef' über die Elementfunktionsdefinition wird das Problem offensichtlich behoben. – Praetorian

+0

@Praetorian Also ist es ein inhärentes Problem ... Schade. –

Antwort

7

Die hintere Rückgabetyp ist ein Teil der Elementfunktion Erklärung, die nicht Mitglieder oder Mitgliederfunktionen Zugriff auf den Daten, nachdem er erklärt hat, im Gegensatz zu der Mitgliedsfunktion Definition, der Fall ist. Mir ist keine Änderung dieses Verhaltens in C++ 14 bekannt.

Siehe 3.4.1-7 des C++ 11-Standard, Unqualifizierte Namen Nachschau:

A name used in the definition of a class X outside of a member function body or nested class definition shall be declared in one of the following ways:

  • before its use in class X or be a member of a base class of X (10.2), or...

(Hervorhebung von mir)

+0

Siehe auch die Definition eines Klassenmembers in 3.3.7/1. – aschepler

Verwandte Themen