
static EntryType Graph::getEntryPoint() { return "_start"; }
void MyClass::init(Graph &g) { const EntryType entry = Graph::getEntryPoint(); }
这么简单的一段程序,调试时看 entry 的值,里面存的东西跟"_start"半毛钱关系都没有。 因为"_start"传出去时隐式 cast 成 EntryType ,然后 EntryType 实现的转换操作里做了一堆骚操作。
1 carlself 2 天前 &t=99s 看看这个视频解压一下,喷了两个小时 C++ |
3 yolee599 2 天前 via Android 我就是能用 C 就不用 C++ |
4 songray 2 天前 @carlself 这个视频我完整的看完了... 最搞的是,从 GitHub 主页来看,这作者真的是 C++ 的高级开发,吐槽的也都在点子上。 看完后我的看法是,越 modern 越复杂,越 modern 越不好用,不如 C with class ( |
5 vfs 2 天前 "然后 EntryType 实现的转换操作里做了一堆骚操作": 所以还是实现 EntryType 的人的问题么。 你 hold 不住就不要用这么高级的特性么,当作 c with class 来写不就可以了么 |
6 xdeng 2 天前 C++ 越来越看不懂,语法越新越看不懂,学学 go 吧 |
7 jeffw 2 天前 重载了等号操作符?感觉没啥毛病 |
8 levelworm 2 天前 via iPhone 我只会写 C+class 。最爽的是用 std::unordered_map |
9 dandeli0n 2 天前 |
10 whenov 2 天前 这不是应该看 EntryType 的构造函数吗 |
11 allentsau 2 天前 via Android C11 |
12 jqknono 2 天前 写了十几年 c++, 仍然觉得恶心, c++本身语法就繁杂, 那种很简洁的 c++只存在于各种书本里. 实际上的代码五花八门. 而且经常不得不去学习 cmake,makefile,gcc,gdb,microcode, 这里边每一个都很恶心, 宏也非常恶心. 总之它可能本身可以写的很优雅, 但是它允许各路人马以各种恶心的方式完成工作, 最气人的是没 bug 能跑, 就是人很难直接看懂. 可以说是一门标准的安卓语言. |
14 cbythe434 2 天前 php 是世界上最好的语言 |
15 givenge 2 天前 |
16 daokedao 2 天前 Rust 现在怎么样了?要不要转 Rust ?或者 Mojo ? |
17 chutianyao 2 天前 这不是你自己的问题么 static EntryType Graph::getEntryPoint() { return "_start"; } 函数返回的"_start"是 String 类型, 你又声明需要 EntryType 类型, 自然就做了隐式转换. 就像楼上说的, 你的 EntryType 如果有 String 类型的构造函数, 自然就能编译通过(转换成 EntryType 类型); 如果不支持, 编译失败你都没机会跑这段代码. 大概率就是你的 EntryType 构造函数瞎搞, 鬼知道他会把 String 类型的值转换成啥 |
19 Zenon 1 天前 不懂,这不是很合理吗 |
20 moudy OP @chutianyao 这是别人写的代码。如果 c++要求写 return EntryType("_start"); 用户起码知道这里可能会有坑。 还有代码写 result = xxxx(); if(result.second) result->second(); 你问这俩 second 有啥区别,呵呵,->被重载了,你猜去吧。 代码光读是没用的,每个符号都 tm 可能是别的意思。挂着 debugger 一层一层往里跟进,就跟解剖一具尸体看肠子里吃的是啥一样。 |
21 thiiadoewjwe 1 天前 C++确实太恶心了,以及各种库的适配,版本问题,动态库链接的问题...让人头大 |
22 moudy OP @carlself 看到一小时二十分钟时我吐槽的玩意终于出现了 class Animal { public: Animal(int animalAge) : age(animalAge) {} private: int age; }; Animal cat = Animal(5); // Clear intention to create an Animal. Animal cat = 5; // Implicitly converts 5 to Animal(5). This is the source of many bugs where programmers mistakenly pass one type around |
24 qiany 1 天前 Javaer 吓哭了 |
26 ihciah 1 天前 via iPad 标准委员会不是第一次犯蠢了。这帮人喜欢搞些奇怪的概念不说,还总是把名字起的贼奇怪。它不光没有防呆设计,它甚至是故意挖坑。正儿八经的 comptime feature 不搞,非要 template 歪门邪道搞元编程,绕口到给人都整出优越感了。 |
27 shilyx 1 天前 委员会对语言的态度,其实该学学 Go 。这里我不评价 Go 语言本身好坏,只说人家管理者的态度。 比如左大括号到底能不能换行、变量声明了能不能不使用,这些在很多语言里都能吵出宗教战争。但 Go 不跟你废话,直接写进规范:要么照做,要么不让编译。你可以骂它固执,但至少世界清净。 反观 C++,则是自由度开到最大。自由不是问题,问题是历史包袱太厚,几十年各种委员会争论不完。你想用个库,作者可能用了 TMP 炼丹、Concept 魔法、SFINAE 黑科技,再加上一堆“C++ 标准只在脚注里提到过一次”的奇技淫巧结果就是:你为了要一口巧克力,不得不顺便吞一整袋巧克力味的屎。 再举个证据: 想看 Go 的官方工具链?就一套,编译器、格式化、linter 、包管理,全是官方说了算。 想看 C++?光编译器就有 GCC 、Clang 、MSVC ,每家对标准的理解都略有不同,还都带着历史兼容的枷锁。 Go 的格式化工具 gofmt 可以让团队几十秒达成统一风格。 C++ 的格式化工具? clang-format 、astyle 、Google Style 、LLVM Style ,每个团队都能吵出三天三夜。 Go 的态度是:“不需要你思考这种低价值问题。” C++ 的态度是:“我给你无限自由,但代价是你得承受数十年遗留设计的后果。” |
28 XIVN1987 1 天前 这么看来,,rust 要成啊这是 |
29 qieqie 1 天前 这个还得怪 C ,隐式类型转换算是 C++继承来的默认行为。不过现在单值构造函数一般的编辑器都会提示你加 explicit 吧? |
30 roundgis 1 天前 via Android 一定是 |
31 sk217 1 天前 @shilyx 关键还是历史问题太多了,一门计算机语言死而不僵,就是这样的,希望用一门语言解决所有的场景问题,那搞出来的语言绝对就是一个大怪物 后 AI 时代,还是人理解比较容易的计算机语言就好,for if function struct generic 强类型 静态类型 差不多概念能解决大部分场景的问题就行了,技术发展大发展后,大部分程序员要变成 AI 代码审查员,易读易懂的代码就是好代码,而不是弄成一堆炫技的黑魔法,诚然有些黑魔法在一些特定领域它就是有用,但是最好不要加入这些特性,隔离出来,另外发明一门语言反而更好,多语言进行调用交互合作即可 小众的场景,像一堆需要在编译时期搞的模板元,谁爱去玩谁就去玩吧,隔离好就行,不要把这种黑魔法引入大部分开发场景就好 |
32 sk217 1 天前 @shilyx linus 对 C++ 的评价是 horrible 的语言,说实话是有道理的。一门语言引入太多的特性并不是一件好事,有需要特定场景部分,单独做成 DSL 去解决是最好的,像模板元 解决的是编译期 如何动态生成代码,那就专门弄一个 DSL 模块 嵌入 C++语言里面 去解决 C++的代码生成问题,而不是在 C++上加入更多的特性去解决这个问题 |
33 cnbatch 1 天前 恶心的是写 EntryType 的那个家伙吧,初始化乱搞 就算用纯 C 来写,我猜测写 EntryType 的那个家伙也会弄成 init("_start"); 然后函数体内部继续一通乱搞 真心想搞恶心操作的话,换其他的语言一样能恶心人 |
34 iseki 23 小时 43 分钟前 via Android 语言语言功能很明显应该由使用者保证没有反直觉的情况,保证不了你就不该去用。别人也没义务为了照顾你看不懂而被迫用某种不自然的方式写代码。 |
36 iseki 23 小时 38 分钟前 via Android 这个和社会分配问题不同, |