2014-10-17 18 views
5

Aşağıdaki kodu rastladım: I (TypeId ve C++ filt kullanarak) bunun türünü kontrol edilip var "char (& (...)) [2]" ne demek?

char (&f(...))[2];

:

char (&(...)) [2]

Ama yapamam bu tür anlam ifade eder. [2] beni atar. o olmadan, örneğin, bir işlev tanımında türlü çoğaltmak:

:

char (&f(...))

f (typeid + C++ filt çıkışından en az) 'de saat ile aynı tiptedir

char& h(...)

+0

Lütfen bu kodun göründüğü içeriğin tamamını gönderin. –

+0

char dönen ve C-tarzı elipse alarak 2 fonksiyon dizisine referans değil mi? – Creris

+3

İki karakterden oluşan bir diziye başvuru döndüren bir işlev. İkincisi ('char (& f (...))', bir karaktere başvuru döndüren bir işlevdir. Dış parantez ikinci durumda gereksizdir ve her iki durumda da '...' C değişkenli bir argüman paketidir. – 0x499602D2

cevap

3

Bu parametre sayısı farklı bir işlev bildirimi ve iki elemanın bir karakter dizisine bir referans verir. Bir yazım hatası kullanarak daha basit bir şekilde bildirilmiş olabilirdi. Örnek

typedef char char_array[2]; 

char_array & f(...); 
2

için Eğer cdecl kullanabilir ve int olarak, elips için rasgele bir yerine ikame:

char (&f(int)) [2] 

ilan

yol açar f fonksiyonu ( int) geri referans olarak char numaralı diziye […]

Geri dönün ve beyanınızı kelimelerinizle doldurun.

2
char (&f(...))[2]; 

Bu, iki karakterlik bir diziye başvuru döndüren bir işlevin bildirgesidir. Sözdizimsel olarak doğru olması için parantez gereklidir. Aksi halde, &, char'a bağlanır ve [2]'un anlamsız olması nedeniyle bir sözdizimi hatası olur.

Sözdizimi bir tür diğer adıyla ayrıştırılabilir. Örneğin:

using array_ref = char (&)[2]; 
array_ref f(...); 

bir dizi yerine gerçek bir dizi için bir referans dönüş için nedeni dizileri fonksiyonları döndürülebilir gerçeğinden taşımaktadır. Bu imkansız. Referansları veya işaretçileri sadece işlevler gibi dizilere döndürebilirsiniz.

Tüm örneklerde, ..., C variadic argument pack'dur. o SFINAE için işlev Bu yüzden uyum parçası olarak kullanılırken bunları nerede


Ben sözdizimi de gördük tek yer olduğunu. Genellikle bu işlev, belirli bir türün bir niteliğini kontrol etmek için şablon değiştirmeyi kullanan aynı adda bir aşırı yüklenmeye eşlik eder.Bir ikame arızası meydana gelirse, ikinci aşırı yük (değişken bir paket alan bir tanesi) geri dönüş olarak seçilir. Dönüş tipi, başarı veya başarısızlığı farklı kılan şeydir.

Örneğin, burada bir tür üye işlev f() varsa denetler özellik sınıfı var:

template <typename T> 
struct has_f 
{ 
private: 
    using true_type = char (&)[1]; 
    using false_type = char (&)[2]; 

    template <typename U> 
    static decltype(std::declval<U>().f(), true_type()) f(int); 

    template <typename> 
    static false_type f(...); 
public: 
    static constexpr bool value = sizeof(check<T>(0)) == 1; 
}; 

Gördüğünüz gibi T üye işlev f() varsa, döndürülen türde sonra büyüklüğünde olacak 1, aksi halde 2. true_type ve false_type, günümüzde standart özellikler sınıfları std::true_type ve std::false_type tarafından büyük ölçüde yerini almıştır, ancak bu, kullanımını göstermek için basit bir örnektir.