2013-04-22 27 views
9

Oluşturucu std::vector için neden özel ayırıcı, allocator davranışlarından noexcept() çıktısını almıyor?neden vektörün hareket ctor noexcept()?

Bu, vektörü kapsülleyen, normal olarak bazı <algorithm> s'de taşınabilen (diğer) vektörü oluşturamayan sınıfa götürür. Altta yatan tür, nessesary gereksinimlerini karşılasa bile (MoveInsertable ve DefaultInsertable).

+0

Çünkü bir hareket ediciden atılabilecek kişiler olabilir –

+4

Bazı kodlar verebilir misiniz? Ne demek istediğini anlamadım. “Özgün'ün davranışları” nı neyin “noexcept”? –

+0

"Alloktor'un davranışları", "noexcept (allocator :: construct (...))' ve 'noexcept (allocator :: destroy (...))' üzerinden boole ifadesi anlamına gelir. – Orient

cevap

4

Ben tarafından "özel ayırıcısı ile std::vector için yapıcı hareket" olduğunu varsayalım bu kurucu yani ayırıcısı-genişletilmiş hareket yapıcısı demek:

vector(vector&& v, const allocator_type& a); 

ana nedeni v.get_allocator() != a o zaman yapıcı tahsis gerektiğidir bad_alloc'u atabilecek daha fazla bellek. Eğer belirli bir türdeki iki ayırıcı her zaman eşit ya da eşit değilse (derhal bunu bir hata olarak bildirdim, bkz. LWG 2108) derleme zamanında bilmenin bir yolu yoktur.

N.B. standart bu kurucuyu veyavector(vector&&) taşıyıcı kurucusunun noexcept olmasını gerektirmez.

+0

Bu durumda, "standart gerektirmez", "standart izin vermiyor" olarak düzeltilebilir, doğru mu? – mcmcc

+0

@mcmcc, hayır, bu doğru değil. Uygulamaların istisna özelliklerinin eklenmesine veya sıkıştırılmasına izin verilir, bu nedenle, her zaman eşit (örneğin, std :: allocator) karşılaştırıldığı bilinen bir ayırma türüyle uzmanlık için 'noexcept (true)' eklemek uygun olur. –

İlgili konular