Başlıksız yapabilirsin:
using size_t = decltype(sizeof(int));
using size_t = decltype(sizeof 1);
using size_t = decltype(sizeof "anything");
Bunun nedeni, C ++ standardının şunları gerektirmesidir:
Sonuç sizeofve sizeof...sabit bir türdür std::size_t. [Not: std::size_tstandart başlıkta <cstddef>(18.2) tanımlanmıştır. - son not]
Başka bir deyişle, standart şunları gerektirir:
static_assert(std::is_same<decltype(sizeof(int)), std::size_t>::value,
"This never fails.");
Ayrıca , aynı typedef-name'in diğer tüm bildirimleriyle eşleştiği sürece, bu typedefbildirimi globalde ve stdad alanında yapmanın tamamen iyi olduğunu unutmayın.typedef (eşleşmeyen bildirimlerde bir derleyici hatası verilir).
Bunun nedeni ise:
§7.1.3.1 Bir typedef-name , bir sınıf bildirimi (9.1) veya enum bildiriminin yaptığı gibi yeni bir tür tanıtmaz .
§7.1.3.3 Belirli bir sınıf dışı kapsamda, bir typedeftanımlayıcı, o kapsamda beyan edilen herhangi bir türün adını, halihazırda atıfta bulunduğu türe atıfta bulunmak üzere yeniden tanımlamak için kullanılabilir.
Bunun ad alanına yeni bir türün eklenmesi anlamına geldiğini söyleyen şüpheciler için std ve böyle bir eylemin standart tarafından açıkça yasaklandığını ve bunun UB olduğunu ve her şeyin orada olduğunu için; Bu tutumun, altta yatan sorunların daha derinlemesine anlaşılmasını görmezden gelmek ve inkar etmek anlamına geldiğini söylemeliyim.
Standart, ad alanına yeni bildirimler ve tanımlar eklemeyi yasaklar stdçünkü bunu yaparak kullanıcı standart kitaplığı karıştırabilir ve tüm bacağını vurabilir. Standart yazarlar için, kullanıcının yapmaması gereken her şeyi yasaklamak ve önemli bir şeyi (ve o ayağı) gözden kaçırma riskini almak yerine, kullanıcının birkaç belirli şeyi uzmanlaştırmasına izin vermek ve iyi bir önlem için başka bir şey yapmayı yasaklamak daha kolaydı. Geçmişte, hiçbir standart konteynerin tamamlanmamış bir tiple somutlaştırılmamasını talep ederken yaptılar , oysa aslında bazı konteynerler bunu yapabilirdi ( bkz.Standart Kütüphaneci: Eksik Türlerin Konteynerleri, Matthew H. Austern ):
... Sonunda, her şey çok karanlık ve çok az anlaşılmış görünüyordu; standardizasyon komitesi, STL kaplarının eksik türlerle çalışmaması gerektiğini söylemek dışında bir seçenek olmadığını düşündü. İyi bir önlem için, bu yasağı standart kütüphanenin geri kalanına da uyguladık.
... Geriye dönüp bakıldığında, teknoloji daha iyi anlaşıldığına göre, bu karar hala temelde doğru görünüyor. Evet, bazı durumlarda, bazı standart kapsayıcıların tamamlanmamış türlerle somutlaştırılmaları için uygulanması mümkündür - ancak diğer durumlarda bunun zor veya imkansız olacağı da açıktır. Çoğunlukla, kullandığımız ilk testin std::vectorkolay durumlardan biri olması şans eseri idi .
Dil kurallarının std::size_ttam olarak olması gerektiği düşünüldüğünde decltype(sizeof(int)), yapmak namespace std { using size_t = decltype(sizeof(int)); }hiçbir şeyi bozmayan şeylerden biridir.
C ++ 11'den önce, çok sayıda şablon almadan sonuç decltypetürünü sizeoftek bir basit ifadede bildirmenin bir yolu yoktu ve bu nedenle de yoktu . size_tfarklı hedef mimarilerinde farklı türleri takma adlar, ancak, yalnızca sonucu için yeni bir yerleşik tür eklemek zarif bir çözüm olmaz sizeofve standart yerleşik yazım türleri yoktur. Bu nedenle, o zamanki en taşınabilir çözüm, size_tbelirli bir başlığa tür takma adı koymak ve bunu belgelemekti.
C ++ 11'de artık standardın bu tam gerekliliğini tek bir basit bildirim olarak yazmanın bir yolu var.