Liste başlatmanın kullanılmasının avantajları hakkında zaten büyük cevaplar var, ancak kişisel başparmak kuralım mümkün olduğunda kıvırcık parantez kullanmak DEĞİL, bunun yerine kavramsal anlama bağlı hale getirmek:
- Oluşturduğum nesne kavramsal olarak yapıcıda geçirdiğim değerleri tutarsa (örn. Kaplar, POD yapıları, atomlar, akıllı işaretçiler vb.), Kaşlı ayraçları kullanıyorum.
- Yapıcı normal bir işlev çağrısına benziyorsa (bağımsız değişkenler tarafından parametrelenen az çok karmaşık işlemleri gerçekleştirirse) normal işlev çağrısı sözdizimini kullanıyorum.
- Varsayılan başlatma için her zaman kıvırcık parantez kullanırım.
Birincisi, bu şekilde her zaman, örneğin, yine de çağrılacak varsayılan bir kurucu veya bir yerleşik / POD türü ile "gerçek" bir sınıf olup olmadığına bakılmaksızın nesnenin başlatıldığından eminim. İkincisi - çoğu durumda - ilk kuralla tutarlıdır, çünkü varsayılan olarak başlatılmış bir nesne genellikle "boş" bir nesneyi temsil eder.
Deneyimlerime göre, bu kural seti varsayılan olarak kıvırcık parantez kullanmaktan çok daha tutarlı bir şekilde uygulanabilir, ancak kullanılamadığında veya istisna "normal" işlev çağrısı sözdiziminden farklı bir anlamı olduğunda tüm istisnaları açıkça hatırlamak zorunda (farklı bir aşırı yük çağırır).
Örneğin, aşağıdaki gibi standart kütüphane türlerine çok uygundur std::vector
:
vector<int> a{10,20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10,20); //Parentheses -> uses arguments to parametrize some functionality,
vector<int> c(it1,it2); //like filling the vector with 10 integers or copying a range.
vector<int> d{}; //empty braces -> default constructs vector, which is equivalent
//to a vector that is filled with zero elements
auto
?