C ++ 11'den önce, sınıf içi başlatma işlemini yalnızca integral veya numaralandırma türünün statik const üyelerinde gerçekleştirebiliyorduk. Stroustrup bunu C ++ SSS bölümünde tartışır ve aşağıdaki örneği verir:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
Ve aşağıdaki mantık:
Öyleyse neden bu uygunsuz kısıtlamalar var? Bir sınıf genellikle bir başlık dosyasında bildirilir ve bir başlık dosyası genellikle birçok çeviri birimine dahil edilir. Ancak, karmaşık bağlayıcı kurallarından kaçınmak için, C ++ her nesnenin benzersiz bir tanıma sahip olmasını gerektirir. C ++, bellekte nesne olarak depolanması gereken varlıkların sınıf içi tanımına izin verirse bu kural bozulur.
Bununla birlikte, C ++ 11 bu kısıtlamaları gevşeterek statik olmayan üyelerin sınıf içi başlatılmasına izin verir (§12.6.2 / 8):
A ile veri üyesi veya temel sınıf statik olmayan belirtilmemişse verilirse olmayan bir delegating yapıcısı olarak, Mem-başlatıcı-id (durumda da dahil olmak üzere hiçbir olduğu yerde mem-başlatıcısı listesinden yapıcısı hayır çünkü ctor-başlatıcı ) ve varlık, soyut bir sınıfın (10.4) sanal bir temel sınıfı değilse
- varlık, bir küme ayracı veya eşitleme başlatıcısına sahip statik olmayan bir veri üyesi ise, varlık 8.5'te belirtildiği gibi başlatılır;
- aksi takdirde, varlık bir değişken üye (9.5) ise, başlatma gerçekleştirilmez;
- aksi takdirde, varlık temerrüt olarak başlatılmıştır (8.5).
Bölüm 9.4.2 ayrıca, constexpr
belirtici ile işaretlenmişlerse const olmayan statik üyelerin sınıf içi başlatılmasına da izin verir .
Peki C ++ 03'te sahip olduğumuz kısıtlamaların nedenlerine ne oldu? Sadece "karmaşık bağlayıcı kuralları" kabul ediyor muyuz yoksa bunun uygulanmasını kolaylaştıran başka bir şey mi değişti?