Bunların esasen [temp.inst] / 2'ye (vurgu mayın) kadar kaybolacağına inanıyorum :
Bir sınıf şablonu uzmanlık örtülü instantiation değil tanımların, bildirimleri örtülü örnekleme neden , varsayılan argümanlar veya noexcept-belirteçleri arasında sınıf üye fonksiyonları, üye sınıflar, kapsamlı üye numaralandırmalar, statik veri üyeleri , üye şablonu, ve Arkadaşlar; [...]
ve [sıcaklık] / 9
Bir uygulama, böyle bir örnekleme gerekmedikçe, sınıf şablonunun statik veri üyesini […] dolaylı olarak başlatmayacaktır.
Örtük şablon örneklemeyle ilgili standarttaki ifadeler birçok ayrıntıyı yoruma açık bırakır. Genel olarak, sadece bir şablon parçalarına güvenemez bana görünüyor değil şartname açıkça öyle diyor sürece örneğinin oluşturulmasını. Böylece:
Snippet # 1
S. Bu kod neden derleniyor? B'den miras alırken A'yı somutlaştırmıyor muyuz? B'de VD yoktur, bu yüzden derleyici buraya bir hata atmamalı mı?
Sen somutlaştırıyorsun A<B>
. Ancak somutlaştırmak A<B>
, statik veri üyelerinin tanımlarını değil, yalnızca bildirimleri somutlaştırır. VB
hiçbir zaman bir tanımın var olmasını gerektirecek şekilde kullanılmaz. Derleyici bu kodu kabul etmelidir.
Snippet # 2
S. Neden gcc9 ile derleniyor / neden clang9 ile derlenmiyor?
Jarod42 tarafından işaret edildiği gibi, beyanı AB
bir yer tutucu türü içerir. Bana öyle geliyor ki standardın ifadeleri burada ne olması gerektiği konusunda net değil. Bir yer tutucu türü içeren bir statik veri üyesinin bildiriminin başlatılması, yer tutucu türü kesintisini tetikliyor mu ve dolayısıyla statik veri üyesinin tanımını gerektiren bir kullanım mı oluşturuyor? Ben açıkça evet ya da hayır diyebilirim standart ifadeler bulamıyorum. Bu nedenle, her iki yorumun da burada eşit derecede geçerli olduğunu ve dolayısıyla GCC ve clang'ın her ikisinin de doğru olduğunu söyleyebilirim.
Snippet # 3
S. B yapısı burada eksikse neden # 2 snippet'inde eksik değil?
Eğer kapatma ulaşabileceği bir sınıf tipi noktada sadece tamamlandıktan }
bir sınıf belirleyici [class.mem] / 6 . Böylece, tüm snippet'lerinizdeki B
örtülü örnekleme sırasında eksik olur A<B>
. Sadece bu Snippet # 1 için alakasızdı. Snippet # 2'de clang No member named AD in B
sonuç olarak size bir hata verdi. Snippet # 2 örneğine benzer şekilde, tam üye takma ad bildirimlerinin ne zaman somutlaştırılacağına dair ifadeler bulamıyorum. Bununla birlikte, statik veri üyelerinin tanımından farklı olarak, bir sınıf şablonunun örtük olarak başlatılması sırasında üye takma ad bildirimlerinin somutlaştırılmasını açıkça önleyecek bir ifade yoktur. Bu nedenle, hem GCC'nin hem de clang'ın davranışının bu durumda standardın geçerli bir yorumu olduğunu söyleyebilirim…
struct B
örneklenmiyor mu?A
B