Re: [問題] 請問我這個程式能用迴圈做嗎?

作者: loveme00835 (髮箍)   2020-04-04 14:43:08
※ 引述《nullpointerk (打滾貓)》之銘言:
: 完成後,下面的程式碼就都可以運作了,在瀏覽器上跑跑看吧
: https://godbolt.org/z/wrd7Rv
: 這樣就優雅解決原 PO 的煩惱了:如果以後要讀更多ID我就無解了
看到很恐怖的 code, 推文可能不是那麼清楚就直接發一篇了
你的程式碼有幾個問題, 有大有小, 後面我列舉出來說明.
namespace collision
一般在開發的時候應該避免把東西放進命名空間 std 裡, 這可能導
致 resolve name 時會模棱兩可. 再來因為參數型別本身不定義在
std 內, 所以無法用 ADL (Argument-Dependent Lookup) 來找到這
個函式
namespace std {
std::string to_string(const std::string::value_type c)
{ return {c}; }
} // namespace std
比較好的做法就是呼叫的時候不使用 qualified name, 透過
using 把候選名單拉進來
using std::to_string, ::to_string;
auto to = to_string(from);
在使用 std::begin() / std::end() 等函式的時候也是一樣, 為了
保有更改容器的彈性, 我們不會用 qualified name, 而是先把可能
的名稱先 using 進來, 編譯器首先會透過 ADL 找尋可用的版本 (
最好是 overloading), 找不到才會回來用 std 底下的模板來具現
化呼叫實體 (因為後者優先權低).
不過在 C++20 以後開始全面引進 CPO (Customization Point
Object) 的概念, 上述所提的 std 函式將會提升為 functor, 在它
們的 call operator 內還是會透過 ADL 找尋呼叫實體, 在那之後
是不是用 qualified name 就不是那麼重要了.
濫用 uniform initialization
uniform initialization 原本是用來消歧異的手段, 但在錯誤的情
境下使用反而會產生語義不明, 例如和 list initialization 混淆
. 如果類別也允許使用 std::initializer_list 來做初始化, 那麼
在接受多個引數的時候你怎麼知道被呼叫的建構子是哪版? 這在
C++17 引進 CTAD (Class Template Argument Deduction) 之後讓
情況更惡化了, 而且 uniform initialization 不允許 narrowing
conversion, 搞清楚意圖再使用會比較好.
Barry Revzin: Uniform initialization isn’t
https://bit.ly/2X91QDS
順帶一提, 你可以加上編譯器選項
作者: sarafciel (Cattuz)   2020-04-06 00:59:00
推,放個假回來就看到兩篇好文章
作者: flysonics (飛音)   2020-04-06 18:57:00
作者: s4300026 (s4300026)   2020-04-07 08:27:00

Links booklink

Contact Us: admin [ a t ] ucptt.com