簡體   English   中英

副作用/易失性/復制構造函數/析構函數

[英]Side effect / Volatile / Copy Constructor / Destructor

參考這里的討論

$ 3.7.1 / 2-“如果靜態存儲持續時間的對象具有初始化或具有副作用的析構函數,則即使它似乎未使用,也不應將其消除,除非可以按照以下說明刪除類對象或其副本。 12.8。”

$ 12.8 / 15-“當滿足某些條件時,即使該對象的復制構造函數和/或析構函數具有副作用,也允許實現省略類對象的復制構造。”

在上述情況下,甚至是易失性讀/寫也可以被優化的情況的特定示例(例如,如果復制構造函數對易失性變量進行讀/寫)。

因此,問題是“即使復制構造函數具有易失性變量的讀/寫操作,復制構造函數也可以被刪除嗎?”

僅當命名對象是非易失性對象時才允許使用NRVO(它在您引用的同一部分,第一個項目符號中正確使用),但是否則我不明白為什么不這樣做。 畢竟,如果您正在創建的對象是易失性的,但您仍在寫入該對象,則不是通過復制構造函數來實現。 而且,它並沒有限定允許忽略哪些副作用,因此很明顯,如果易失性讀/寫操作在復制構造函數本身內,則編譯器不必關心。

有時。 有趣的是,您應該問,因為我對volatile記憶猶新(約翰內斯大聲疾呼),使我不得不仔細檢查這種瑣事。

§12.8/ 15:

在具有類返回類型的函數中的返回語句中,當表達式是具有與函數返回類型相同的cv不合格類型的非易失性自動對象的名稱時,可以通過構造自動對象來省略復制操作直接進入函數的返回值

因此,可以通過省略構造函數來消除volatile訪問,但是如果整個對象都是易失性的則不能。

而且,如果函數按值返回volatile foo而不是平原foo ,這也會有所不同,因為volatile臨時構造無法被忽略!

foo factory_a(); // return class by value
const foo factory_b(); // also return by value: rather pointless
volatile foo factory_c(); // implies no elision

請注意,返回的臨時文件的cv資格也會影響臨時文件的訪問語義,例如factory_b().non_const_method()是非法的。 因此,這比傻瓜更不可思議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM