[問題] 透過copy elision 來return by value

看板C_and_CPP作者 (JOMI)時間3年前 (2020/09/01 11:36), 編輯推噓0(0036)
留言36則, 3人參與, 3年前最新討論串1/1
標題不好下 主要問題是 一個class被標註 copy constructor = delete的時候 我卻透過by value的語意 使用他 具體code 我用lock_guard<...>來舉例 https://wandbox.org/permlink/kNmQm9tWjXAJEbVH 看到不少code, 有人這樣使用 lock_guard<mutex> getLock(){return lock_guard<mutex>{m};} 這種code 貼到ideone C++14就不給過 兩個問題 1. 因為C++17 copy elision, 這種使用方式 是完全沒問題的嗎? 2. 假設沒問題, 因為只有C++17後才能這樣寫, 我自己會覺得寧可不要寫這種 code 盡量維持 backward compatible. 3. 如果好的包法 要怎麼做呢? 以前通常是把get set包出去 內部用lock去r/w member struct { void GetX(){ lock_guard...} void SetX(...){lock_guard....} private: int x; mutex m; } 但這樣變成 要提供get/set... 所以我猜才會有人想要提供一個RAII Locker的getter 讓外面先acquire lock 直接把member public出去給外面操作 該怎麼做比較好呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.30.36 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1598931374.A.FDE.html

09/01 12:19, 3年前 , 1F

09/01 12:20, 3年前 , 2F
提供 lock、unlock
09/01 12:20, 2F

09/01 12:21, 3年前 , 3F
是說 getLock 這樣寫好怪,有連結可以讓我觀摩一下嗎?
09/01 12:21, 3F

09/01 12:30, 3年前 , 4F
沒有連結耶 內部的code 不只一個人這樣寫 @@
09/01 12:30, 4F

09/01 18:18, 3年前 , 5F
可能第一個人寫下去後後面的接著抄吧...
09/01 18:18, 5F

09/01 19:40, 3年前 , 6F
也許是這樣 但我是想探討 這種方式是否沒任何問題,如果
09/01 19:40, 6F

09/01 19:40, 3年前 , 7F
沒有 這感覺很鑽漏洞的感覺
09/01 19:40, 7F

09/01 20:50, 3年前 , 8F
我是覺得不行啦,寫這種意圖怪怪的 code...
09/01 20:50, 8F

09/02 00:04, 3年前 , 9F
你先想寫類別的目的是什麼? 是提供抽象化. 而 mutex
09/02 00:04, 9F

09/02 00:05, 3年前 , 10F
目的就是要確保抽象化有被達成, 具體來說就是物件的
09/02 00:05, 10F

09/02 00:06, 3年前 , 11F
狀態改變不會有意外發生. 你為了 mutex 反而增加和類
09/02 00:06, 11F

09/02 00:07, 3年前 , 12F
別責任無關的方法, 你同事都不會覺得奇怪嗎? 一般有
09/02 00:07, 12F

09/02 00:09, 3年前 , 13F
mutex 也會經過封裝, 讓使用者傳入 callback 來間接
09/02 00:09, 13F

09/02 00:10, 3年前 , 14F
存取物件, 實作可以參考 boost::with_lock_guard(),
09/02 00:10, 14F

09/02 00:35, 3年前 , 15F
多做一層封裝在之後確定存取都在同一個 thread 之後
09/02 00:35, 15F

09/02 00:35, 3年前 , 16F
也可以直接把 mutex 拿掉, client code 不需要做調整
09/02 00:35, 16F

09/02 00:37, 3年前 , 17F
所以你會看到有些函式庫進 critical section 是給
09/02 00:37, 17F

09/02 00:37, 3年前 , 18F
callback 而不是明確地寫 lock 敘述
09/02 00:37, 18F

09/02 00:38, 3年前 , 19F

09/02 00:46, 3年前 , 20F
當你在傳東西給 callback 的時候, 最好是用限縮後的
09/02 00:46, 20F

09/02 00:48, 3年前 , 21F
介面, 看是要用 std::forward_as_tuple() 或是允取存
09/02 00:48, 21F

09/02 00:48, 3年前 , 22F
取的成員放在 base class 內, 再怎麼樣都不會搞到把
09/02 00:48, 22F

09/02 00:49, 3年前 , 23F
所有成員都變成 public, 那這樣你還寫 C++ 幹嘛呢
09/02 00:49, 23F

09/03 10:25, 3年前 , 24F
抱歉我沒有跟上 請問寫一個Access inner class有什麼
09/03 10:25, 24F

09/03 10:25, 3年前 , 25F
好處嗎? 為什麼不直接散裝getX/setX在Foo就好?
09/03 10:25, 25F

09/03 10:26, 3年前 , 26F
我還沒理解精隨~ 這樣看起來caller必須多.access()
09/03 10:26, 26F

09/03 10:26, 3年前 , 27F
如果有多個data member也是必須開getA getB 多個嘛?
09/03 10:26, 27F

09/03 11:08, 3年前 , 28F

09/03 11:10, 3年前 , 29F
不做特別處理的單個成員 setter/getter 還不如不寫
09/03 11:10, 29F

09/03 11:10, 3年前 , 30F
access 是一個概念, 雖然本來的物件無法複製, 但存取
09/03 11:10, 30F

09/03 11:11, 3年前 , 31F
權是可以被任意複製轉移的, 這是 OO 的設計, 仔細思
09/03 11:11, 31F

09/03 11:12, 3年前 , 32F
考一個問題: 如果一個物件只允許你存取部分的資料成
09/03 11:12, 32F

09/03 11:12, 3年前 , 33F
員, 那存取的介面是否應該直接開在這個類別裡? 還是
09/03 11:12, 33F

09/03 11:14, 3年前 , 34F
把 "特定資料成員的存取權" 這個概念抽象化出來, 未
09/03 11:14, 34F

09/03 11:15, 3年前 , 35F
如果要做 composition 也可以做在這個 Access 類別
09/03 11:15, 35F

09/03 11:16, 3年前 , 36F
裡, 和目標物件無關
09/03 11:16, 36F
文章代碼(AID): #1VJS6k_U (C_and_CPP)