→ poyenc: const 不是為了避免修改, 而是要求物件的行為 consistent 05/13 17:07
→ poyenc: 這是為什麼 mutable 存在的原因, 這可以從兩個角度來看: 05/13 17:10
→ poyenc: 1) 給物件的人 2) 收物件的人, 對於收的人來說加上 const 05/13 17:14
→ poyenc: 是希望物件的外顯行為能一致, 這是基本假設. 對給的人來說 05/13 17:15
→ poyenc: 加上 const 是用來限縮可用介面, 也許是為了避免狀態被改 05/13 17:17
→ poyenc: 動, 或者只是想提供不同的介面組合給對方 (使用 ref 05/13 17:21
→ poyenc: qualifier 也可以達成類似目的). 所以收的時候需要注意綁 05/13 17:23
→ poyenc: 定的 value category 以及 constness, 給的人也要看情況使 05/13 17:23
→ poyenc: 用 std::forward()/std::move()/std::as_const() 05/13 17:24
→ poyenc: 所以 pass by value 的情況下不用加上 const 的原因是使 05/13 17:30
→ poyenc: 用者只有執行函式的執行緒, 所以要求行為一致是沒有意義的 05/13 17:31
→ poyenc: noexcept 的用意和 throw() 不一樣, 在 C++ 裡我們應該預 05/13 17:57
→ poyenc: 設所有函式都會 throw 但你可以透過 throw() 來說你其實不 05/13 17:58
→ poyenc: 會 throw, 而編譯器所做的相應處理是把 propagate excepti 05/13 17:59
→ poyenc: on 的 code 拿掉, 換句話說 noexcept 是優化的手段和 05/13 18:00
→ poyenc: exception handling 策略無關, 那取捨其實就看團隊了, 大 05/13 18:01
→ poyenc: 部分針對 scalar type 的操作比較容易加上 noexcept 來優 05/13 18:01
→ poyenc: 化, 而其他情形就看你們對效能的要求來做決定. 這都是需要 05/13 18:02
→ poyenc: 先做 profiling 05/13 18:03
→ lovejomi: 上面我需要理解一下,如果是primitive 加上const是必要 05/13 18:09
→ lovejomi: 的嗎? 05/13 18:09
→ poyenc: 跟是不是 primitive 無關, 由預期的行為決定加不加 const 05/13 18:19
→ poyenc: 如果你期望兩次 std::cout << i << std::endl; 出來的值都 05/13 18:20
→ lovejomi: 把 propagate exception 的 code 拿掉 <== 我想確認 05/13 18:20
→ lovejomi: 內部使用try catch(...){} 確保他不會propagate 這件事 05/13 18:20
→ lovejomi: 應該跟"compiler拿掉" 兩者沒衝突對吧? 05/13 18:20
→ poyenc: 要一樣, 不應該有其他執行緒去更改值, 最好加上 const 來 05/13 18:20
→ poyenc: 表達意圖 05/13 18:21
→ poyenc: 沒錯, 但 noexcept 與否應該藉由實作程式碼來決定而不是反 05/13 18:26
→ poyenc: 過來由介面限制實作, 你在裡面寫了 try-catch 其實是和編 05/13 18:26
→ poyenc: 譯器做類似的事情, 所以我們才會用 noexcept() 運算子來決 05/13 18:27
→ poyenc: 定函式的 signature 而不是用人工去比對 05/13 18:28
推 FRAXIS: 那 class member 要加 const 嗎? 如果初始化之後就不變了 05/13 21:29
→ lovejomi: @poyenc: 問一下,你有這樣深入見解是有讀什麼文章或書 05/13 21:53
→ lovejomi: 籍嗎 05/13 21:53
→ lovejomi: 我也從網路上找不少文章但沒有這麼深入 05/13 22:01
→ lovejomi: 另外 以我的範例 你會怎麼抉擇實作 謝謝 05/13 22:02
→ poyenc: @FRAXIS 要看你對該 instance variable 型別有什麼要求, 05/13 22:05
→ poyenc: 在介面受限的情況下是不是還能實作你想要的類別, 來去決定 05/13 22:06
→ poyenc: constness, @lovejomi 只是比較常和 committee member 討 05/13 22:07
→ poyenc: 論而已, 我覺得要看你對 const 的理解是到語法層還是語意 05/13 22:08
→ poyenc: 層, 我的習慣是預設全加 const, 還有需要 noexcept 的情況 05/13 22:10
→ poyenc: 全用 noexcept(bool) 來決定. 預設全加 const 是為了減輕 05/13 22:11
→ poyenc: 讀碼的負擔還有方便驗證, 不過 pass by value 不會加const 05/13 22:12
→ poyenc: 因為這情況在介面加 const 是多餘的 05/13 22:13
推 eye5002003: 至今沒寫過一次noexcept,這東西以後被刪除的機率很高 05/14 09:05
→ eye5002003: 我常常寫foo(const std::string &str);既然read only 05/14 09:08
→ eye5002003: 就沒必要整個複製一遍了 05/14 09:10
→ Jockey66666: 如果是string的話直接用string_view吧 05/14 22:38