In-class initializers (C++ 11 özelliği) küme parantez içine alınmalı veya a = işaretini takip etmelidir. Parantez içinde belirtilemezler.Neden sınıf başlatıcısı yalnızca = veya {} kullanıyor?
Bunun nedeni nedir?
In-class initializers (C++ 11 özelliği) küme parantez içine alınmalı veya a = işaretini takip etmelidir. Parantez içinde belirtilemezler.Neden sınıf başlatıcısı yalnızca = veya {} kullanıyor?
Bunun nedeni nedir?
Bu konuda% 100 olumlu değilim, ancak bu bir sözdizimi belirsizliğini önlemek olabilir. Örneğin, şu sınıfı dikkate alın:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
Belirtilen çizgi ne anlama geliyor? Yazıldığı gibi, bu, Overloaded
türünde bir nesne (işlev bildirimi içinde adı belirtilmemiş) bir parametre olarak kabul eden ve int
değerini döndüren confusing
adında bir üye işlevinin bir bildirimidir. C++ 11, başlatıcıların parantez kullanmasına izin verecek olsaydı, bu durum belirsiz olurdu, çünkü tipinde confusing
isimli bir üye tanımı, Overloaded
veri elemanının değerine ilklendirilmiştir. (. Bu Most Vexing Parse ile cari konuyla ilgilidir)
küme parantezi gerektiren olarak, bu belirsizlik kaldırılır:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
Şimdi, confusing
aslında Overloaded
değerine başlatıldı bir int
olduğu açıktır Çünkü bunu bir işlev beyanı olarak okumanın bir yolu yoktur.
Bu yardımcı olur umarız!
"Kafa karıştırıcı" ifadesinin neden tanım ve açıklama olmadığını ayrıntılı olarak açıklayabilir misiniz? ** "Bu," Overloaded "türünde bir nesne olarak parametre kabul eden kafa karıştırıcı adlı bir üye işlevinin tanımıdır. Bu karışıklığa sahibim, çünkü belirsiz olmalı? –
@ Koushik- Haklısın, bu açıklama değil, tanım olmalı. Bunu düzeltmeme izin ver. – templatetypedef