SORU
22 NİSAN 2011, Cuma


::std vektör, varsayılan inşaat, C 11 ve son değişiklikler

Hakkında fikrinizi almak istiyorum oldukça ince bir sorunla karşı bugün koştum.

Aşağıdaki bahçe tipi paylaşımlı-beden-deyim sınıf göz önünde bulundurun:

struct S
{
    S() : p_impl(new impl) {}
private:
    struct impl;
    boost::shared_ptr<impl> p_impl;
};

Eğlence şu şekilde: vektör içine bu koymak çalıştığınızda görünür

std::vector<S> v(42);

Şimdi, MSVC 8 ile en az, v tüm elementler impl aynı üye paylaşın. Aslında, bu neden vector kurucu:

template <typename T, typename A = ...>
class vector
{
    vector(size_t n, const T& x = T(), const A& a = A());
    ...
};

Perde altında, tek S nesne varsayılan inşa alır, vector n öğeleri kopyalanır.

Şimdi, C rvalue başvuruları 11 ile. Böyle iş olamaz. A vector olarak inşa edilmiştir

std::vector<S> v(42);

o zaman büyük olasılıkla, uygulamaları kopyalamak inşaat bulunmayabilir beri vektör içinde n nesneleri varsayılan oluşturmak için seçti. Bu durumda bu bir son dakika değişikliği olabilir.

Benim sorum:

  1. std::vector yapıcı yukarıda, yani olarak tanımlanmış olmalıdır C 03 standart görev yapıyor. varsayılan argüman ? Özellikle orada vektör nesnesinin girişleri varsayılan inşa yerine kopyaladığı garantisi mi ?
  2. C 11 standart aynı bu konuda ne diyor ?
  3. C 03 C ve 11 arasında bir kırılma değiştirmek için bir olasılık olarak görüyorum. Bu soruşturma başlatılmıştı sorun oldu mu ? Çözüldü ?

PS: sınıfın varsayılan kurucu S hakkında yorum yok, yukarıda Lütfen. Bu veya tembel inşaat çeşit uygulama oldu.

CEVAP
22 NİSAN 2011, Cuma


C 03 standart std::vector yapıcı yukarıda tanımlanmış olmalıdır görevini, yani yok varsayılan bir değişken ile? Özellikle orada vektör nesnesinin girişleri varsayılan inşa yerine kopyaladığı garantisi mi?

Evet, belirtilen davranış x kap x tüm kopyalarını n öğeleri içeren başlatıldı n kez kopyalanır.


C 11 Standart aynı bu konuda ne diyor?

C 11'de bu iki kurucu kurucular haline getirildi.

vector(size_type n, const T& x, const Allocator& = Allocator()); // (1)
explicit vector(size_type n);                                    // (2)

Artık ikinci parametre için varsayılan bir değişken olması dışında(1)çalışır gibi aynı şekilde C 03: 26* *n defa kopyalanır.

x, varsayılan argüman yerine(2)eklendi. Bu değer başlatır n kapsayıcı öğeler yapıcı. Hayır kopya yapılır.

Eğer eski davranış gerekiyorsa, emin olabilirsiniz(1)yapıcı çağırma için ikinci bir argüman sunarak denir:

std::vector<S> v(42, S());

C 03 C ve 11 arasında bir kırılma değiştirmek için bir olasılık olarak görüyorum. C 03 C ve 11 arasında bir kırılma değiştirmek için bir olasılık olarak görüyorum. Bu soruşturma başlatılmıştı sorun oldu mu? Çözüldü?

Evet senin örnek gösterdiği gibi, bu gerçekten bir son dakika değişikliği.

Tam olarak emin değilim bir üye C standardizasyon Komitesi (ben edemedim ödenen özellikle yakın ilgi için kütüphane ile ilgili gazetelerde postalar), bilmiyorum ne derece bir son dakika değişikliği oldu tartıştı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • Microsoft Help & Training Videos

    Microsoft He

    31 Mart 2009
  • PlugResearch

    PlugResearch

    22 Mart 2006