SORU
16 Mayıs 2014, Cuma


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
16 Mayıs 2014, Cuma


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ış.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • Rachel Raum

    Rachel Raum

    10 EYLÜL 2007
  • Stevie

    Stevie

    2 Mayıs 2010