7

Aşağıdaki gibi bir genel işlev yazıyorum. BenC++ Şablonlarda genel başlatma hakkında

/// 
    T a = T() 
    cout << a << endl; 
    // do something with iterators 

ben bekliyorum olarak başlatıldı değeri 0 olduğunu görebilirsiniz içine başlatma değiştirirseniz iken

template<class Iterator, class T> 
void foo(Iterator first, Iterator last) { 
    T a; 
    cout << a << endl; 
    // do something with iterators 
} 

typedef vector<double>::iterator DblPtr; 
vector<double> values; 
foo< DblPtr, int>(); 

Bu fonksiyonlar, değişken a için tanımlanmamış bir değerini yazdırır.

Ben değişken varsayılan değerle başlatılır, ama T a = T() ararsanız ben kopya kurucu Optimizasyon nedeniyle hala varsayılan biridir T() değeriyle denilen gerektiğine inanıyoruz T a çağırırsanız.

Bu 2 satırın arkasındaki farkın ne olduğunu ve bunun neden gerçekleştiğini anlayamıyorum?

cevap

11

Öncelikle, int gibi yerleşik türlerin varsayılan başlatılması, bunları başlatılmamış olarak bırakır. Değer başlatması, sıfır başlatılmış bırakır. copy initialization kullanarak, bu bir değer başlatma olduğu

T a; 

: sizin örneğin gelince

Bu varsayılan başlatma olduğu

T a = T(); 

Fotokopileri burada elided edilebileceğini haklısın, bu nedenle bu vardır tek bir değer başlatılmış T nesnesinin yaratılmasının etkisi. Bununla birlikte, T'un devredilebilir veya taşınamaz olması gerekir. Yerleşik tiplerde durum böyledir, ancak akılda tutulması bir kısıtlamadır. Bu bir işlev bildirimi olduğu için

kopya başlatma sözdizimi gereklidir:

T a(); 

ancak C++ 11 yapmanızı sağlar böyle değer-başlatılamıyor:

T a{}; 
+0

Büyük açıklama! Hepsi açık ve çok teşekkürler. –