2015-03-27 17 views
8

C++ 11 (ve C++ 14) STL kapsayıcıları noexcept destructor ve clear() üye işlevlerine sahiptir.STL konteyner öğeleri açıkça (noexcept) olarak imha edilebilir mi?

Bu, öğelerin noexcept destructor'larının da olması gerektiğini veya en azından, kapsayıcılarda depolanan asıl öğelerin imha edildiğinde veya herhangi bir şekilde karşılık gelen allocator_traits<Allocator>::destroy çağrısının atmaması gerektiğinde herhangi bir özel durum oluşturmaması gerektiğini belirtir.

Bu, standartta herhangi bir yerde (başka bir açık gereksinim tarafından açıkça veya ima edilen) bir gereksinim olarak belirtiliyor mu? Değilse neden?

Biliyorum is_nothrow_constructible, noexcept bir yok edici gerektirir, ancak is_constructible tek başına yapmaz ve kapsayıcı gereksinimleri, tür özellikleri şablonlarından ziyade, kavramlar açısından belirtilir.

Bazı durumlarda (değiştirme fonksiyonları, işleyicisi işlevleri standart kütüphane şablon bileşenlerini oluşturmak için kullanılır tipleri üzerindeki işlemler) 'de
+0

konteyner yıkıcı yakalayıp elementin destructor (ler) den herhangi istisnaları göz ardı başladı. –

cevap

7

17.6.4.8/1, C++ standart kütüphane C++ program tarafından sağlanan bileşenlere bağlıdır. Bu bileşenler gereksinimlerini karşılamıyorsa, Standard, uygulamasında hiçbir gereksinim duymaz. Özellikle

17.6.4.8/2, etkileri aşağıdaki durumlarda tanımsız gibidir:

...

  • herhangi yedek işlev veya işleyici işlevi veya yıkıcı operasyonu istisna yoluyla çıkar, eğer Özel olarak izin verilmediği sürece,uygulanabilir Gerekli davranış: paragraf.
+0

Hm… Sadece fark ettim: kullanıcı tarafından sağlanan ayırıcılar üzerinde benzer bir gereklilik olmalı, doğru mu? Biri var mı? –

+0

** 17.6.3.5 ** tablo 28'de, 'ayırma' için bir girdi '' ayırma '' uygun bir istisna oluşturabilir ''; "deallocate" için giriş " istisnalar atmaz" diyor. Sorduğun bu mu? –

+0

Ah, doğru! Evet, tam olarak ne demek istedim, teşekkürler. Bazı nedenlerden dolayı o bölümdeki tabloyu aramam benim için gerçekleşmedi. –

İlgili konular