Re: [討論] 對於同事的coding style感到很感冒

作者: lovejomi (JOMI)   2020-05-13 23:56:06
這篇推文有些確實讓我不太理解 另開這篇問一下
"所以 pass by value 的情況下不用加上 const 的原因是
使用者只有執行函式的執行緒, 所以要求行為一致是沒有意義的"
這句話我真的不太理解
const跟 thread有什麼關聯?
意思是說 都已經複製了
裡面不管怎麼使用這物件 R/W
外面就算有其他thread 不管做什麼都已經跟這複製的物件無關了
所以const就沒意義
======================
"const 不是為了避免修改, 而是要求物件的行為 consistent"
這邊的consistent 我沒有很深刻的感受 這邊能多提供一些資訊嗎?
另一個觀點
如果對方沒有你這些認知 完全單純覺得 const就是語法上的不能修改
他才會有
void Foo(int a) 留言要+ const
void Foo(const string a) 留言覺得const useless
講到這邊都覺得有點矛盾了
如果不能修改 那const string a他不應該有意見....
所以我才推論他只有 primitive + const, non-trivial的就不加
這邊我想問 如果要說服他或是把你這串觀念用英文表達 有沒有文章說這呢?
=====================================
"需要 noexcept 的情況全用 noexcept(bool) 來決定"
這邊可否給我一些例子 我比較能理解用法
void XD(string a) noexcept(std::is_nothrow_move_constructible<string>::value)
{
}
當我寫出這行時 我自己都不知道自己在幹嘛了
1. a不見得是by move 那by copy怎麼辦?
2. 假設走by copy......這個XD函數 可能exception會發生在 參數傳遞時的呼叫...
這是不是表示 這函數已經不可能是noexcept了?
3. 因為缺乏noexcept(bool)這用法上的經驗, 實在很難理解
雖然我不知道 exception specification為什麼被deprecated, 但沒了他
我怎麼知道這函數丟什麼exception? 如果他沒寫document 我根本無從得知 對吧?
當我在設計virtual function() 這時候 noexcept就已經要決定true or false了.
當決定了 derived 就被鎖死了, 這邊又讓我覺得 interface上限定noexcept似乎太硬了
stackoverflow當然有一些方法 例如寫兩版
但我覺得這只是在找workaround沒有很能接受
==========================================
承上
void XD()
noexcept(
noexcept(string()) && // for ss default construction
noexcept(string{*static_cast<string*>(nullptr)}) && // for s{lvalue}
noexcept(declval<string>().operator=(declval<string>())) && // for ss =
rvalue
noexcept(operator+(string{*static_cast<string*>(nullptr)},
declval<string>())) // for ss = lvalue+rvalue
)
{
string ss;
string s{ss};
ss = s+ string("");
}
假設上面一堆noexcept(bool) 我都沒有寫錯
這是不是最完美的寫法?
我寫的每一行code 我都驗證了他的exception or not
但我覺得有點過頭了.....
===========================================
因為我在開發windows
用win32 api 跟 com api + std
理論上這兩套都是error code base
所以我可以有這結論嗎? =>
我自己開發的api 都可以 冠上 noexcept
然後實作總是
try{因為使用了std 他會丟 or new delete也會丟 }
catch(...) {return errorcode;}
雖然聽起來有點以偏概全
但我想不到不能的理由
既能optimize又能保證不會有exception產生
還是try catch補上去 反而會有其他的overhead產生
(不是runtime exception發生後的成本 而是額外程式碼被產生)
以上
謝謝
※ 引述《lovejomi (JOMI)》之銘言:
: 謝謝各位的意見
: 我會在逐一理解
: 目前有幾個問題
: 最近比較被要求寫exceptional 的code
: 假設我寫
: string Foo(string s) noexcept
: {
: auto a = Get(); // noexcept
: string r = s+a;
: return r;
: }
: 然後我確認operator+是不是noexcept
: 結果當然不是
: 變成我要為了這簡單的+
: 寫一個try catch...去handle exception
: 三個抉擇點
: 1. 不要標註noexcept , 反正壞了上面該處理 無責聲明 (我prefer這)
: 2. try catch(type1) catch(type2) catch(...) 把所有查的到的exception都handle
: 要不要分開handle 是by design
: 3. 就現在這樣寫 反正真的發生bad_alloc 我也無能為力 terminate吧
: 以上有沒有什麼比較建議的做法可以討用在多數情形
: 現在變成想提供noexcept 函數 都要查每一行function call是否都是noexcept
: 反而覺得 預設不該noexcept 才合理 有需求才標註noexcept
: ==================
: 一個很無聊的const問題
: 古早的effective c++推廣 能加const就加
: 所以這位同事當然遵守
: void Foo(const int a)
: {
: auto const rc = Win32();
: auto const hr = COM();
: auto const error = 3rdAPI();
: ...
: }
: 我認同const能確保不被亂改
: 但我其實是覺得很多餘
: local變數改了也不會怎樣(也不該怎樣)
: 甚至會被改表示你有需求 搞不好還會因此改code拿掉const
: 問題來了
: 他今天看到某同事
: void Bar(const string s){// read-only }
: 留言 這是多餘的 要拿掉
: 對我來說當然不該補const 裡面如果以後有copy需求 就不能move了
: 但我反倒覺得他兩套標準
: 這case只有read加上const不正是他遵守的鐵則嗎?
: 也可以Bar(RVALUE); 為啥這情況他認為"useless"? 雙重標準的感覺
: 我沒看到他針對函數local non-trivial變數的寫法
: 也許也是不加const為主 (也是雙標)
: 這邊的問題就是
: 盡可能const 這件事如果套用在modern C++ 有沒有什麼common的標準用法呢?
: 我比較主觀的歸納是
: primitive type能const就const
: non-trivial type 都不要加(但這太偏頗了)
: 我自己是習慣都不加
: 以上
: 謝謝
作者: smmoon (邦)   2020-05-15 15:00:00
這類型的問題似乎永遠也吵不完....
作者: steve1012 (steve)   2020-05-16 17:57:00
他是在header 留不要const? 還是在source file 留?top level const 不影響function signature. 有加跟沒加一樣

Links booklink

Contact Us: admin [ a t ] ucptt.com