2011-03-22 1 views
31

Ho trovato per caso che il compilatore Clang permette:Qual è la classe inline C++?

inline class AAA 
{ 
}; 

in C++. Cos'è questo?


PS. L'ho segnalato alla mailing list di Clang [email protected] e ora in attesa di risposta. Aggiornerò questa domanda per essere informato.

+0

inline funzione ha senso .... ma di classe in linea ?? – mpen

+8

"Cos'è questo?" - Qualcosa che non esiste nel C++ standard. Lo specificatore 'inline' è per funzioni, non classi. Potresti esserti imbattuto in un bug nel compilatore Clang C++. –

+1

Aggiunto il tag 'clang', non ho trovato nulla sul bug tracker, potrebbe valerne la pena aprirne uno (potresti sempre postare una mail a cfe-dev [at] cs.uiuc.edu in anticipo se non sei sicuro). Se questo è sulla linea 2.9, probabilmente vorranno ripararlo presto. –

risposta

12

clang non dovrebbe permettere questo, inline può essere utilizzato solo nella dichiarazione di funzioni, da ISO/IEC 14882: 2003 7.1.2 [dcl.fct.spec]/1:

Funzione -specificatori possono essere utilizzati solo nelle dichiarazioni di funzioni.

inline è uno dei tre -funzione specificatori, virtual e explicit essendo gli altri.

Come osserva @MatthieuM, nella prossima versione di C++ (C++ 0x), la parola chiave inline sarà inoltre consentito in definizioni di namespace (con semantica diversa a inline come funzione-specifier).

+1

Nel contesto di C++ 0x, può essere utilizzato anche con spazi dei nomi. –

+0

@Matthieu: Potresti ampliarlo? – Xeo

+3

@Xeo: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm –

33

E 'consentito nel caso in cui si desidera dichiarare una funzione che restituisce un oggetto di quella classe direttamente dopo la classe di dichiarazione, per esempio:

#include <iostream> 

inline class AAA 
{ 
public: 
    AAA() 
    { 
     // Nothing 
    } 

    AAA(const AAA& _Param) 
    { 
     std::cout << "Calling Copy Constructor of AAA\n"; 
    } 
}A() 
{ 
    AAA a; 
    return a; 
}; 

int main() 
{ 
    A(); 
    return 0; 
} 

Inoltre si dovrebbe notare gli errori del compilatore (o avvisi) che compaiono in altri casi illegali, come la dichiarazione di una variabile invece di A(), notano anche che il compilatore afferma di ignorare la parola chiave inline se non si dichiara alcuna funzione.

Spero che sia utile.

Edit: per il commento di Eonil

Se si sta parlando il tuo codice di cui sopra per la questione, allora è lo stesso caso come la vedo io, il compilatore vi darà un avvertimento: 'inline ' : ignored on left of 'AAA' when no variable is declared

Tuttavia, se si utilizza il codice nella mia risposta, ma sostituire A() con una variabile, B per esempio, verrà generato un errore di compilazione: 'B' : 'inline' not permitted on data declarations

così troviamo che il compilatore non sbaglia ingegno Accettando tali dichiarazioni, che ne dici di provare a scrivere inline double; da solo?Si genererà un avvertimento: 'inline ' : ignored on left of 'double' when no variable is declared

Ora che ne dici di questa dichiarazione:

double inline d() 
{ 
} 

non dà avvisi o errori, è esattamente lo stesso di:

inline double d() 
{ 
} 

dal la precedenza di inline non è affatto importante.

Il primo codice (in tutta risposta) è simile alla scrittura:

class AAA 
{ 
    // Code 
}; 

inline class AAA A() 
{ 
    // Code 
} 

che è legale.

E, in altro modo, si può essere scritta come:

class AAA 
{ 
    // Code 
}; 

class AAA inline A() 
{ 
    // Code 
} 

Si sarebbe sollevato se si vede il primo codice (in tutta risposta) scritto come:

#include <iostream> 

class AAA 
{ 
    // Code 
} inline A() 
{ 
    // Code 
}; 

Ma sono uguali, poiché non c'è importanza per la precedenza di inline.

Spero sia chiaro e convincente.

+3

I miei occhi !! +1 anche se per un esempio piacevole e criptico quando funziona. :) – Xeo

+0

@Xeo: Peace, brother :) –

+2

Potresti elaborare WTF, sta succedendo qui? Perché dovrei mai dichiarare una funzione del genere, ed è quella funzione un metodo della classe? – polemon