SORU
21 Temmuz 2015, Salı


`X = std:: (x)` tanımsız hareket?

x Daha önce başlatılmış bir tür değişken olsun. Aşağıdaki satır:

x = std::move(x)

tanımsız? Burada standart olarak bu ve bunun hakkında ne diyor?

CEVAP
21 Temmuz 2015, Salı


Hayır, bu hareket atama nasıl uygulanır bağlıdır tanımsız davranış, uygulama tanımlı davranış olacak.

İlgili bu. LWG issue 2468: Self-move-assignment of library types , not bu sorun, etkin ve henüz resmi bir teklif bu kabul edilmelidir göstergesi yerine kesin, ama işaret bölümler vardır yer için standart kütüphane ve puan onlar şu anda çatışma. Diyor ki:

Yazdığımız varsayalım

vector<string> v{"a", "b", "c", "d"};
v = move(v);

V devlet ne olmalıdır? Standart bir şey söylemiyor kendi kendine hareket-atama hakkında belirli. Birkaç ilgili metin var standart parçalar, ve onları uzlaştırmak için nasıl net değil.

[...]

Öncelikli olan net değil çünkü bu parçaları bir araya koymak için nasıl metinden belli değil. Belki 17.6.4.9 [res..argümanlar] wıns (v = move(v) tanımsızdır yani MoveAssignable şartları belirtilen değil örtülü bir ön şart getirir, ya 23.2.1 [kap.belki gereksinimleri.genel] wıns (açıkça verir ek garanti için Konteyner::operator= ötesinde ne var garantili için kütüphane fonksiyonları genel olarak, v = move(v) no-op), ya da belki başka bir şey.

Mevcut uygulamaları kontrol ettim, asıl önemli olan, v = move(v) çıktı ortaya vektör; bırakmadı vektörü değişmeden ve olmadı da neden bir kaza.

ve öneriyor:

Gayriresmi: değişiklik MoveAssignable ve Konteyner gereksinimleri tablo (ve herhangi bir diğer gereksinimleri tablo söz taşımak atama varsa) için, açık olan x = hareket(x) tanımlanan davranış ve yaprakları x içinde geçerli ama durumu belirsiz. Bu standart bugün ne diyor, muhtemelen değil, ama niyetimiz ve uygulamaları gerçekte ne ile kullanıcıların söyledik ne ile tutarlı değil herhalde.

Not, yerleşik temelde bir kopyasıdır bu tür için, taslak C 5 ** 14 standart bölümünde görebilirsiniz[ifade.göt]:

Basit atama (=), ifadenin değeri nesnenin sol tarafından sevk yerine işlenen.

5.17 yazan yere sınıflar için durum daha farklı:

Eğer sol işlenen sınıf türü ise, sınıfın tam olacaktır. Bir sınıfın nesneleri için atama tanımlanır kopyala/taşı atama operatörü (12.8, 13.5.3).

Not tin self move warning vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • jpmkm1

    jpmkm1

    4 NİSAN 2008
  • MyCyberAcademy

    MyCyberAcade

    2 EKİM 2011