2013-05-27 9 views
9

consideri il following code:decltype nella dichiarazione di metodo di una classe: errore quando usato prima "riferimento" membro è dichiarato

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

    int data; 
}; 

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

Si dà il seguente errore:

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

Tuttavia, se ho posto data sopra func(), non dà alcun errore (live code):

struct test {  
    int data; 

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

... 

E così la mia domanda è: perché è decltype, non considerando i membri dichiarati dopo (quando decltype viene utilizzato in una dichiarazione di metodo, non nella definizione)? Voglio anche sapere se ci sono cambiamenti in questo comportamento nelle future iterazioni dello standard di linguaggio.


Si prega di notare che sto chiedendo questo perché mi aspettavo decltype a comportarsi in modo diverso. La mia convenzione di codifica consiste nel posizionare membri di dati di classe al di sotto delle funzioni di classe. Sicuramente questo diverso comportamento influenzerebbe il modo in cui organizzo i membri della mia classe. Sarei molto grato se è possibile fornire alcuna soluzione alternativa che avrebbe preservare la mia convenzione di codifica.

+0

Sorry - la natura del C++, ereditato da C . –

+0

non è solo 'decltype', anche un semplice' typedef' mostra la [stesso comportamento] (http://coliru.stacked-crooked.com/view?id=8f959fbd70b0b7d44c21ff0d71967fd5-6f7ec8a47f20223a17b26973b6e13527). Spostare il 'typedef' sopra la definizione della funzione membro ovviamente risolverà il problema. – Praetorian

+0

@Praetorian Quindi è un problema inerente ... Peccato. –

risposta

7

Il trascinamento tipo di ritorno fa parte della funzione membro dichiarazione, che non ha accesso ai membri di dati o funzioni membro dichiarate dopo che, a differenza della funzione membro definizione, che fa. Non sono a conoscenza di alcun cambiamento in questo comportamento in C++ 14.

Vedi 3.4.1-7 dello standard C++ 11, Nome generico di look-up:

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...

(sottolineatura mia)

+0

vedere anche la definizione del campo di applicazione un membro della classe a 3.3.7/1. – aschepler

Problemi correlati