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