Bu bir tasarım hatası gibi görünüyor, şimdi düzeltildi.
void boyutlandırma (size_type: tek kapların bir üye fonksiyonu değerle yerine const referans olarak parametre (T) geçer STL defects 679
C++ 98 standart belirtir gelen teklif
sz, Tc = T()); Bu gerçek, yıllar içinde tekrar tekrar tartışılmış/tartışılmıştır, ilk kez C++ 98'in onaylanmasından önce bile ilk kez onaylanmıştır. değeriyle bu parametreyi geçirerek gerekçesi olmuştur:
Yani ifadeleri başvuran bu kendini işine garanti edilir, örneğin: push_back için imzadır olarak
v.resize(v.size() + 1, v[0]);
Ancak bu gerekçe inandırıcı değil:
void push_back(const T& x);
Ve push_back yeniden boyutlandırmak için benzer semantiklere sahiptir (ekleme). Ve push_back de kendi kendine referans durumda çalışmalıdır:
v.push_back(v[0]); // must work
değeriyle T geçirerek ile sorun referans olarak geçen önemli ölçüde daha fazla pahalı olabilir olmasıdır. Bu görüşme aynı zamanda doğrudur, ancak doğru olduğu zaman genellikle çok daha az dramatiktir (ör., Skaler tipler için).
Mevcut taşıma semantikleriyle bile, bu parametreyi değere göre iletmek pahalı olabilir.> Örneğin vektörü için göz önünde bulundurun: geçiş değer-ile-durumunda
std::vector<int> x(1000);
std::vector<std::vector<int>> v;
...
v.resize(v.size()+1, x);
x boyutlandırmak parametre için bir kez kopyalanır. Ve sonra dahili olarak, kod ne kadar yeniden boyutlandırmanın vektörü büyüttüğünü derleme zamanında bilmediği için, x, yeniden boyutlandırma parametresinden vektör içindeki doğru yerine ikinci kez kopyalanır (taşınmaz).
Teslim özniteliği referansı ile, yukarıdaki örnekte x'in yalnızca bir kez kopyalanması gerekir. Bu durumda, x pahalı bir kopya oluşturucusuna sahiptir ve böylece kaydedilebilecek herhangi bir kopya önemli bir tasarruf anlamına gelir.
Eğer push_back için verimli olabilirsek, yeniden boyutlandırma için de verimli olmalıyız. Referans parametresi alarak yeniden boyutlandırma kodlanmış ve CodeWarrior kütüphanesinde, farkında olduğum herhangi bir sorun bildirilmeden gönderilmiştir.
Önerilen çözünürlük:
değiştirme 23.3.3 [deque], p2:
class deque {
...
void resize(size_type sz, const T& c);
değiştirme 23.3.3.3 [deque.capacity], P3:
void resize(size_type sz, const T& c);
değiştirme 23.3. 5 [liste], p2:
class list {
...
void resize(size_type sz, const T& c);
Ch ange 23.3.5.3 [list.capacity], P3:
void resize(size_type sz, const T& c);
değiştirme 23.3.6 [vektörü], p2:
class vector {
...
void resize(size_type sz, const T& c);
değiştirme 23.3.6.3 [vector.capacity] p11:
void resize(size_type sz, const T& c);
@ user814628 Bu bana doğru gelmiyor. 'Value_type val = value_type()' adlı tek zaman işe yaramazsa, 'value_type', const olmayan bir referansa sahip olan bir kopya kurucusuna sahip olsaydı. –
Daha önce hiç fark etmedim * yeniden * boyutlandırmak için ikinci bir parametre * (...)! Sanırım bir gün için bir şey öğrendim ve şimdi yarına kadar gidebilir. : -P – aldo