2015-07-23 32 views
14

bu typedefs döndüren bazı typedefs ve bazı işlevler de vardır.İşaretçi typedef neden std :: vector :: data()? std :: vektör API olarak

örn.

reference operator[](size_type n); 

Nerede reference ve size_type typedefs bulunmaktadır. o ondan alır pointer bir typedef vardır

ayırıcı şablon tartışma.

T* data() noexcept; 

yerine:

pointer data() noexcept; 

bu arkasında bazı mantık var mı neden böyle data() işlevi imzadır? Ayrıca neden T* yerine value_type* olduğunu.

bunu kontrol etmek isterseniz

Ben standardın bölüm 23.3.6.4 olduğunu.

cevap

21

data()'un nedeni, vektörün içindeki temel diziye bir işaretçi bulmaktır, böylece (örneğin), iteratörler değil işaretçilerle çalışan API'lere iletebilirsiniz.

pointer typedef, gerçek bir işaretçi türü olması gerekmediğinden, bir işaretçi gibi davranan bazı sınıf türleri olabilen bir yazım hatasıdır (bazen "fantezi işaretçi" olarak da bilinir). Varsayılan durum için

, std::vector<T> std::vector<T, std::allocator<T>> ve std::allocator_traits<std::allocator<T>>::pointer T* aynı tür olduğundan, hiç fark etmez.

Ama std::vector<T, CustomAllocator<T>>data() eğer için

bir pointer Eğer is_same<pointer, T*>::value doğrudur bir T* sürece bekliyor bir işleve geçmek mümkün olmaz döndü.

+5

Ayrıca bkz. LWG sorunu [1312] (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1312) (hangisi değişti) – hlt

+1

Görüyorum Bunun nedeni, "işaretçiyi" döndürmesi durumunda C'nin birlikte çalışabilirliğinin bozulacağıdır. Bu işlevin nedeni bu, mantıklı. Teşekkürler. – davidcorne

+5

Doğru, sadece C birlikte çalışabilirlik değil. Ayrıca ham işaretçilerle uğraşan C++ API'leri vardır. –