F(x), x f önce değerlendirilebilir?
C bir programı var. Bu program böyle bir şey yapar:
struct MyT {void memfunc(std::unique_ptr<MyT> arg);};
std::unique_ptr<MyT> obj = /* some init */;
obj->memfunc(std::move(obj));
Bu geçerli olacağı garanti edilir, ya da bir üyesi nullptr
işlevini çağıran sona erebilir miyim?
Standart geçerli teklif.
Bağımsız değerlendirme sırasını unsequenced olduğunu biliyorum, ama sıralama w ne olduğunu hatırlamıyorum.r.t. çağrılacak fonksiyon nesne.
CEVAP
Burada bir değerlendirme fonksiyonu çağırmak için gereklidir ve yan etkileri ile ilgili kanıtlar alıntı işlev çağrısı önce sıralı.
Ayrıca, tüm diğer değerlendirmeler özellikle sıralı indeterminately sıralı.
Birbirlerine saygı ile, onlar kalır rağmen alt ifadeler değerlendirilmiş üzerinde herhangi bir sipariş kısıtlamalar empoze etmezunsequencedbirbirimize saygı ile.
1.9 Programı yürütme Madde 15
Belirtilenler dışındabireysel ifadelerin taşıyıcının bireysel operatörleri ve işlenen değerlendirmeler unsequenced.
[...]
Bir operatörün işlenen değer hesaplamaları değeri operatör sonucu hesaplama önce sıralı. Eğer skaler bir nesne üzerinde bir yan etkisi aynı skaler nesne ya da anotherside etkisi ya da değer hesaplama aynı skaler nesnenin değeri kullanarak göreli unsequenced, davranışı tanımsızdır.
Bir fonksiyonu çağırırken(ya da değil işlevi satıriçi), her değeri hesaplama ve yan etkisi ile ilgili herhangi bir değişken, ifade veya sonek ifade tayin denilen işlevi, sıralı önce yürütme her ifade veya deyim vücut fonksiyonu denir.
[ Not: Değer hesaplamaları ve yan etkileri ifadeleri unsequenced farklı değişken ile ilişkili. —son not ]
Her değerlendirme arama işlevi (işlev çağrıları da dahil olmak üzere diğer) değil aksi özellikle sıralı önce veya sonra infaz vücut denen işlevdir indeterminately sıralı ile ilgili yürütme fonksiyonu denir.9C çeşitli bağlamlarda karşılık gelen işlev çağrısı sözdizimi görünmesine rağmen bir işlev çağrısı değerlendirme neden olabilirçeviri biriminde. [ ... ]
Çağrılan işlev yürütme sıralama kısıtlamalar yukarıda açıklandığı gibi () işlevi çağıran bir ifade sözdizimi her ne değerlendirilmiş, işlev çağrıları özellikleri vardır.
Diğer ilgili teklifleri std::move
hakkında
remove_reference::şablon typename type&& taşıma (&&t) noexcept;
Verir: static_cast<typename remove_reference::yazın&&>(t).
4**:
20.7.1.2.4 unique_ptr gözlemciler
operatör -^ işaretçi . () noexcept sabit;
Gerektirir: ()! = nullptr.
Döner: ().
memfunc
3 Telefon aldık çok değer argüman alır:
a) obj->memfunc
b) std::move(obj)
c) harekete geçti argüman yapıcı.
B) bir şey değişmez, bağımsız değişkeni için göz ardı edebiliriz:
a ve c ya da diğer önce olabilir indeterminately seri noları.
Eğer birinci olursa, her şey iyi, c obj
değişen bir önemi yok.
Eğer c ilk bakış açısına göre, bir sıfırlanmış ile değerlendirilir obj
, İK var şartı ihlal.
Özet olarak, izin verilen siparişlerin bir tanımsız davranış olduğundan Tanımsız Davranış.