2015-05-16 23 views
6

std::swap bu şekilde bildirildi:engelli istisnalar ve noexcept()

benim programda istisnalar devre dışı bırakırsanız
template <class T> void swap (T& a, T& b) 
    noexcept (is_nothrow_move_constructible<T>::value && 
       is_nothrow_move_assignable<T>::value); 

(gibi için -fno-exceptions ile g ++) olacaktır eğer olurlarsa benim özel tipler için std::swap kullanım hareket operasyonları hareketsiz kılınmış olup olmadıklarının önemi yok mu?

DÜZENLEME: takip soru:

benim tipim, onları var benim gerçek soru is_nothrow_move_assignable<> gibi özelliklerin ne olur ise her zaman hamle kullanacağı std :: takas kavramadan sonra?

std::vector, türlerim noexcept(true) taşıma işlemlerinin yapılıp yapılmadığını yeniden tahsis ederken her zaman kullanıldı mı?

+0

Derleyicinin '' move'' kuralları istisnalara ortogonaldir. –

+0

@AmiTavory hareket kurallarını evet, ama '' 'is_nothrow_move_constructible'' gibi özellikleri nedir? – onqtam

+1

"is_nothrow_move_constructible" sonucunu basan bir kısa (3 satırlık) test programı yazabilirsin. –

cevap

4

swap üzerine noexcept-şartname sadece o bir istisna karşılaşmadan swap kullanabilirsiniz kullanıcı söyler. uygulama pratikte her zaman etrafında eğer nesneleri hareket eder ve ancak, aşırı yük çözünürlüğü bir hareket atama operatörü ve/veya yapıcı seçer

auto tmp = std::move(a); 
a = std::move(b); 
b = std::move(tmp); 

eşdeğerdir.

2

Evet. noexcept sadece std::swap'un T 'un hareket ettiricisini hareket ettirip atmayacağını belirtir. swap'un gövdesinin davranışını etkilemez - T'un hareket yapıcısını kullanır ve atamaları olup olmadıklarına ve özel durumlarla etkinleştirilip etkinleştirilmediğinize bakılmaksızın atama hareketini kullanır.