Re: [問題] 關於c++11 ctor行為

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間7年前 (2018/06/24 13:11), 7年前編輯推噓3(306)
留言9則, 4人參與, 7年前最新討論串2/2 (看更多)
以前剛好有研究過這個 NRVO: 1.啟動條件,缺一不可 return語句為非靜態之物件名稱 物件與函數返回類型相同,忽略CV修飾 該物件非函數的參數 2.符合以上條件時可省略ctor的呼叫,特別注意以下事項 copy語意仍在 屬於implementation-defined 3.阻止NRVO的情況 物件類型與函數返回類型不同,例如兩種類型有繼承關係時 涉及if/else這種條件分支 return語句不是"物件名稱",例如reference(非物件)、三元運算子、物件成員、指標指 向的內容 RVO: 1.啟動條件 以prvalue初始相同類型時,忽略CV修飾 2.符合以上條件時可省略ctor的呼叫,特別注意以下事項 copy語意仍在 屬於implementation-defined,僅存在C++17以前的版本 guaranteed copy elision: 1.啟動條件 以prvalue初始相同類型時,忽略CV修飾 2.符合以上條件時可省略ctor的呼叫,特別注意以下事項 無copy語意 屬於standard,C++17以後才有 move ctor: 1.啟動條件,擇一即可 用std::move包起來 return語句為非靜態之物件名稱 return語句為prvalue 2.符合以上條件時可呼叫move ctor,特別注意以下事項 有NRVO、RVO、guaranteed copy elision時不考慮這個 3.阻止move的情況,此時會呼叫copy ctor 所選ctor的參數類型不是該變數類型的rvalue ref時,以lvalue重新選擇(兩類型有繼承 關係時發生) 物件不可為const,因為T(T&&)不吃const return語句不是"物件名稱",例如reference(非物件) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.50.186.132 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1529817114.A.F5B.html ※ 編輯: loveflames (110.50.186.132), 06/24/2018 13:56:45

06/24 14:26, 7年前 , 1F
感謝整理
06/24 14:26, 1F

06/24 16:23, 7年前 , 2F
感謝整理 總之Q2中g把吃進來的rvalue ref當成xvalue
06/24 16:23, 2F

06/24 16:24, 7年前 , 3F
但是這個xvalue還是一個reference,因此不會用mv ctor
06/24 16:24, 3F

06/24 16:28, 7年前 , 4F
比較不懂的是copy semantics的保留與否是甚麼意思呢?
06/24 16:28, 4F

06/24 17:09, 7年前 , 5F
就是需不需要存在的意思 你要先能存取才能 copy elision
06/24 17:09, 5F
改一下原文用語 ※ 編輯: loveflames (110.50.186.132), 06/24/2018 19:57:18

06/24 23:46, 7年前 , 6F
喔喔 https://goo.gl/8vVaVX 另參照這裡 總之c++17
06/24 23:46, 6F

06/24 23:48, 7年前 , 7F
對於部分寫法直接當作沒有copy這個語意存在了
06/24 23:48, 7F

06/24 23:48, 7年前 , 8F
感謝提點
06/24 23:48, 8F

06/25 04:19, 7年前 , 9F
也太複雜XD
06/25 04:19, 9F
文章代碼(AID): #1RBoWQzR (C_and_CPP)
文章代碼(AID): #1RBoWQzR (C_and_CPP)