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.
Lütfen bu kodun göründüğü içeriğin tamamını gönderin. –
char dönen ve C-tarzı elipse alarak 2 fonksiyon dizisine referans değil mi? – Creris
İ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