2016-04-06 11 views
3

, ben bulmak bu:std :: listenin çok öğeli ekleri kesinlikle istisnada güvenli midir? 17 <code>exceptional c++</code> ait öğesinde

Öncelikle, bütün konteynerler için, çok eleman ekler ("yineleyici aralığı" eklemeler) kuvvetle istisna güvenli asla.

ancak öğenin 1 effective STL içinde

, bunu buldum:

Birden-eleman yerleştirmeleri işlem semantiğini gerekiyorsa (örneğin, aralık formu - bakınız Madde 5), istediğiniz edeceğiz listeyi seçmek için, , çünkü liste çok öğeli eklentiler için işlemsel semantik sunan tek standart kapsayıcıdır.

listeleri için

, hatta çoklu eleman ekleme işlemleri işlemin güvenlidir:

ve 249the c++ standard library 2th sayfasında yer

, bunu bulmak.

Benim sorum doğru olan hangisi? Güvenle olağanüstü güvenli, işlem güvenliğiyle aynı mıdır?

cevap

2
  1. hangisi doğru? std::list::insert tüm aşırı için

güçlü istisna güvenliği garanti edilir. bir özel durum ise

İstisnalar

, hiçbir etkisi (kuvvetli istisna garantisi) vardır.

ve standardından

, $23.3.5.4/2 list modifiers [list.modifiers]: bir istisna var atılır ise

hiçbir etkileridir.

sonra

  1. kuvvetle olağanüstü güvenlikli işlemle aynı güvenli demektir?

Evet. Here 'un bir açıklaması Herb Sutter:

Güçlü Garanti: Bir istisna atılırsa, program durumu değişmeden kalır. Bu düzey her zaman, bir işlem başarısız olursa bir konteynere hiçbir başvuru veya yineleyicinin geçersiz kılınmaması da dahil olmak üzere, global taahhüt veya geri alma semantiği anlamına gelir.

+0

Bu yüzden Herb Sutter bu konuda yanlış mı? – guorongfei

+0

@guorongfei Evet, açıkça. – songyuanyao

1

std::list'un bu garantileri standartlara uygun olarak sağladığı yanıtlanmıştır. neden listesinden bunu yapmaktan bahsetmek isterim.

Bu garantiyi sağlayabilirsiniz, çünkü liste, karmaşık olmayan bir birleştirme işlemine sahip olmayan bir işlemdir. Yapmanız gereken tek şey önce bir geçici liste oluşturmak, geçici listeyi değerlerle doldurmak ve geçici listeyi orijinal listeye birleştirmektir.

Geçici listeyi doldururken istisna meydana gelirse, hiçbir şey birleştirilmez ve insert çıkarıldığında geçici liste atılır.

Başka hiçbir kapsayıcı, hiçbir zaman atmayan birleştirme sağladığından, başka bir kap ile mümkün değildir.

İlgili konular