2011-03-22 16 views
31

przypadkowo okazało się, że kompilator Clang umożliwia:Co to jest klasa inline C++?

inline class AAA 
{ 
}; 

w C++. Co to jest?


PS. Zanotowałem to na liście mailingowej Clang [email protected], a teraz czekam na odpowiedź. Zaktualizuję to pytanie po otrzymaniu powiadomienia.

+0

inline funkcja ma sens .... ale inline klasy ?? – mpen

+8

"Co to jest?" - Coś, czego nie ma w standardowym C++. Specyfikator 'inline' dotyczy funkcji, a nie klas. Być może natknąłeś się na błąd w kompilatorze Clang C++. –

+1

Dodałem tag 'clang', nie mogłem znaleźć niczego na temat śledzenia błędów, może warto go otworzyć (zawsze możesz napisać wiadomość do cfe-dev [at] cs.uiuc.edu wcześniej, jeśli nie masz pewności). Jeśli jest to w linii 2.9, prawdopodobnie będą chcieli to wkrótce naprawić. –

Odpowiedz

12

dzyń nie powinno to pozwolić, inline mogą być wykorzystane tylko w deklaracji funkcji z normą ISO/IEC 14882: 2003 7.1.2 [dcl.fct.spec]/1:

Function -specifiers może być używany tylko w deklaracjach funkcji.

inline jest jednym z trzech funkcyjnego specyfikatorami, virtual i explicit być inne.

Jak zauważa @MatthieuM, w następnej wersji C++ (C++ 0x), słowo kluczowe inline będzie również dozwolone w definicji przestrzeni nazw (z różnymi semantyki do inline jako funkcyjnego-specyfikatorem).

+1

W kontekście C++ 0x można go również używać z przestrzeniami nazw. –

+0

@Matthieu: Czy mógłbyś to rozwinąć? – Xeo

+3

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

33

Jest dozwolone w przypadku, gdy chcesz zadeklarować funkcję zwracającą obiekt tej klasy bezpośrednio po klasie deklaracji, na przykład:

#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; 
} 

Ponadto należy zauważyć błędy kompilatora (lub ostrzeżenia), które pojawiają się w innych nielegalnych przypadkach, takich jak deklarowanie zmiennej zamiast A(), należy również zauważyć, że kompilator stwierdza, że ​​ignoruje słowo kluczowe inline, jeśli nie zadeklarowano żadnej funkcji.

Mam nadzieję, że to pomocne.

Edit: W komentarzu Eonil

Jeśli mówimy o kodzie powyżej w pytaniu, to jest ten sam przypadek jak widzę, kompilator daje ostrzeżenie: 'inline ' : ignored on left of 'AAA' when no variable is declared

jeśli jednak użyć kodu w mojej odpowiedzi, ale zastąpić A() o zmiennej B na przykład, to wygeneruje błąd kompilatora: 'B' : 'inline' not permitted on data declarations

więc okazuje się, że kompilator nie popełnił błędu dowcip h akceptując takie deklaracje, jak samemu próbować napisać inline double;?wygeneruje ostrzeżenie: 'inline ' : ignored on left of 'double' when no variable is declared

Teraz jak o tym oświadczeniem:

double inline d() 
{ 
} 

to nie daje ostrzeżenia lub błędy, to jest dokładnie to samo:

inline double d() 
{ 
} 

od Pierwszeństwo inline nie jest w ogóle ważny.

Pierwszy kod (w całym odpowiedź) jest podobny do zapisu:

class AAA 
{ 
    // Code 
}; 

inline class AAA A() 
{ 
    // Code 
} 

który jest legalny.

A w inny sposób, może być zapisany jako:

class AAA 
{ 
    // Code 
}; 

class AAA inline A() 
{ 
    // Code 
} 

Można by zostać zwolniony, jeśli pojawi się pierwszy kod (w całym odpowiedzi) pisemne jak:

#include <iostream> 

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

Ale są takie same, ponieważ nie ma znaczenia dla pierwszeństwa inline.

Mam nadzieję, że jest to jasne i przekonujące.

+3

Moje oczy !! +1 dla miłego i tajemniczego przykładu, kiedy to działa. :) – Xeo

+0

@Xeo: Pokój, bracie :) –

+2

Czy możesz opracować WTF, dzieje się tutaj? Dlaczego miałbym kiedykolwiek deklarować taką funkcję i czy ta funkcja jest metodą klasy? – polemon