Cevaplama sürecinde başka bir soru ben biraz farklı ifadelere tökezledi std::vector::erase()
ve std::deque::erase()
.
C ++ 14'ün söylediği şey std::deque::erase
( [deque.modifiers]/4-6
, benimki vurgu):
Etkileri: ...
Karmaşıklık: Yıkıcıya yapılan çağrıların sayısı, silinen elemanların sayısıyla aynıdır, ancak atama operatörüne yapılan çağrıların sayısı, silinmiş elemanlardan önceki eleman sayısından ve elemanlardan sonraki eleman sayısından az değildir. silinen öğeler.
Atar: Kopya oluşturucu, taşıma yapıcısı, atama işleci veya taşıma atama işleci tarafından istisna oluşturulmadıkça hiçbir şey yapılmaz
T
.
Ve işte std::vector::erase
( [vector.modifiers]/3-5
) hakkında söyledikleri :
Etkileri: ...
Karmaşıklık: yıkıcı
T
sayısı olarak adlandırılır silinir eleman sayısına eşit, ancak hareket atama operatörü arasındaT
sayısı olarak adlandırılır silinir elemanları sonra vektöründe eleman sayısını eşittir.Atar: Kopya oluşturucu, taşıma yapıcısı, atama işleci veya taşıma atama işleci tarafından istisna oluşturulmadıkça hiçbir şey yapılmaz
T
.
Gördüğünüz gibi, her ikisi için istisna özellikleri aynıdır, ancak std::vector
taşıma atama operatörünün çağrıldığı açıkça belirtilmiştir.
Orada şartı da var T
olmaya MoveAssignable
yönelik erase()
her ikisi ile çalışmak için std::vector
ve std::deque
(Tablo 100), ancak bu hamle atama operatörünün varlığını anlamına gelmez: Bir kopyası atama operatörü tanımlamak ve hareket atama operatörü tanımlamaz ve bu sınıf söylenmeyeceğim olmak MoveAssignable
.
Her ihtimale karşı, GCC ve Clang ile kontrol ettim ve gerçekten de std::vector::erase()
hareket atama operatörü yoksa kopya atama operatörünü çağırıyor std::deque::erase()
ve aynı şeyi yapıyor ( DEMO ).
Yani soru şudur: Bir şey mi kaçırdım, yoksa bu standarttaki (editöryal) bir sorun mu?
Güncelleme: 2477 numaralı LWG sorununu gönderdim .