Soru C ++ satır içi sınıfı nedir?


Yanlışlıkla Clang derleyicisinin izin verdiğini buldum:

inline class AAA
{
};

C ++ 'da. Bu nedir?


PS. Bunu Clang posta listesine bildirdim cfe-dev@cs.uiuc.eduve şimdi cevap bekliyorum. Bu sorumu bilgilendirdiğim tarafından güncelleyeceğim.


32
2018-03-22 07:35


Menşei


satır içi işlev anlamlıdır .... ama satır içi sınıf ?? - mpen
"Bu nedir?" - Standart C ++'da bulunmayan bir şey. inline belirtici, sınıflar için değil, işlevler içindir. Clang C ++ derleyicisindeki bir hataya rastlamış olabilirsiniz. - In silico
Katma clang tag, hata izleyicide hiçbir şey bulamadım, bir tane açmaya değer olabilir (eğer emin değilseniz cfe-dev [at] cs.uiuc.edu için bir mail gönderebilirsiniz). Bu 2.9 satırında ise, muhtemelen yakında düzeltmek isteyeceklerdir. - Matthieu M.
Bu, derleyiciye tanımladığınız sınıf için nesne yönelimli kod üretmemesini söyleyen bir şey olabilir. Belki daha hızlı hız yapmak için sınıf bildirim ve bellek yönetimini kullanıcı koduna genişletir. - Hossein
Teşekkürler beyler. Bunu bildirdim cfe-dev@cs.uiuc.edu. Ve cevap bekliyorum. - Eonil


Cevaplar:


Bu sınıfın bir nesnesini, örneğin 'beyannameden sonra doğrudan geri döndüren bir işlevi bildirmek istediğiniz takdirde izin verilir, örneğin:

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

Ayrıca, diğer değişken durumlarda görünen derleyici hatalarını (veya uyarıları) A()Ayrıca, derleyicinin, onu yok saydığını belirtir. inline Herhangi bir işlev beyan etmediyseniz anahtar kelime.

Umarım faydalıdır.

Düzenle: Eonil'in yorumu için

Sorunuzda yukarıdaki kod hakkında konuşuyorsanız, o zaman gördüğümle aynı durumda, derleyici size bir uyarı verecektir: 'inline ' : ignored on left of 'AAA' when no variable is declared

Ancak, kodu cevabımda kullanırsanız A() bir değişkenle B örneğin, bir derleyici hatası oluşturur: 'B' : 'inline' not permitted on data declarations

Bu yüzden derleyicinin böyle beyanları kabul etmekle hiç bir hata yapmadığını, yazmayı denemeye ne dersiniz? inline double; kendi başına? Bir uyarı üretecektir: 'inline ' : ignored on left of 'double' when no variable is declared

Şimdi bu deklarasyona ne dersiniz?

double inline d()
{
}

Hiçbir uyarı veya hata vermez, tam olarak aynıdır:

inline double d()
{
}

dan beri Önceliği inline hiç de önemli değil.

İlk kod (bütün cevabın içinde) yazıya benzer:

class AAA
{
    // Code
};

inline class AAA A()
{
    // Code
}

Yasal olan

Ve, başka şekilde, şöyle yazılabilir:

class AAA
{
    // Code
};

class AAA inline A()
{
    // Code
}

İlk kodun (bütün cevabın içinde) yazılı olarak görüldüğü takdirde rahatlamış olursunuz:

#include <iostream>

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

Ama aynıdır, çünkü önceliği için hiçbir önemi yoktur. inline.

Umarım açık ve ikna edici olur.


33
2018-03-22 08:35



Gözlerim!! Çalışırken güzel ve şifreli bir örnek için +1. :) - Xeo
@ Xeo: Barış, kardeşim :) - Tamer Shlash
WTF'yi detaylandırır mısın, burada mı oluyor? Neden böyle bir işlevi ilan edeyim ki, bu sınıfın bir işlevi midir? - polemon
@polemon: Bu fonksiyon o sınıfın bir yöntemi değildir, kendi başına bir işlevdir, kapanış ayracından hemen sonra ve noktalı virgülden önce funciton veya değişkenleri bildirebilirsiniz. ; ve bu (işlev) o sınıfın bir nesnesini döndürecektir (ve değişken bu sınıfın bir nesnesi olacaktır). Ve nedense, aslında işlevler için bir nedenim yok, değişkenler için bazı sebepler olabilir, ancak şu anda bunların hiçbiri bende değil. - Tamer Shlash
@ Mr. TAMER'ın özel yapısı belki yasal olun (ve kesinlikle deli), ama eğer bir fonksiyon yoksa, derleyicinin reddetmek Bu konuda uyarmak değil. (Ve Xcode4 ile clang sürümü ne de yapmaz.) Bu hala bana bir hata gibi kokuyor. Bu konuda standarttan bölüm ve ayet var mı? - Nicholas Knight


clang buna izin vermemeli, inline sadece işlev beyanında kullanılabilir, ISO / IEC 14882: 2003 7.1.2 [dcl.fct.spec] / 1:

Fonksiyon-belirticilere sadece işlev bildirimlerinde kullanılabilir.

inline üç kişiden biri fonksiyon belirteçleri, virtual ve explicit Diğerleri olmak.

@MatthieuM notları, C ++ (C ++ 0x) 'in bir sonraki sürümünde, inline Ayrıca anahtar kelime, ad alanı tanımlarında da kullanılabilir. inline olarak fonksiyon belirteci).


13
2018-03-22 07:40



C ++ 0x bağlamında, ad alanlarıyla da kullanılabilir. - Matthieu M.
@Matthieu: Bunun üzerine genişleyebilir misiniz? - Xeo
@Xeo: open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm - In silico
@ Silico: Teşekkürler! - Xeo


Clang mail listesinden bir cevap aldım. Bu bir hataydı: http://llvm.org/bugs/show_bug.cgi?id=3941

Bununla birlikte, son inşada zaten sabitlenmiş görünüyor. Yine de teşekkürler :)

İşte konuşma: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html


8
2018-03-24 17:55