V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moudy
V2EX  ›  C++

再一次感觉到 C++的恶心

  •  
  •   moudy · 1 天前 · 3248 次点击

    static EntryType Graph::getEntryPoint() { return "_start"; }

    void MyClass::init(Graph &g) { const EntryType entry = Graph::getEntryPoint(); }

    这么简单的一段程序,调试时看 entry 的值,里面存的东西跟"_start"半毛钱关系都没有。 因为"_start"传出去时隐式 cast 成 EntryType ,然后 EntryType 实现的转换操作里做了一堆骚操作。

    24 条回复    2025-11-28 00:47:04 +08:00
    carlself
        1
    carlself  
       1 天前   ❤️ 2
    &t=99s 看看这个视频解压一下,喷了两个小时 C++
    aloxaf
        2
    aloxaf  
       22 小时 35 分钟前
    @carlself 好家伙,两个小时,这作者对 C++ 是真爱啊😆
    yolee599
        3
    yolee599  
       22 小时 31 分钟前 via Android   ❤️ 2
    我就是能用 C 就不用 C++
    songray
        4
    songray  
       22 小时 11 分钟前   ❤️ 1
    @carlself 这个视频我完整的看完了...
    最搞的是,从 GitHub 主页来看,这作者真的是 C++ 的高级开发,吐槽的也都在点子上。

    看完后我的看法是,越 modern 越复杂,越 modern 越不好用,不如 C with class (
    vfs
        5
    vfs  
       22 小时 1 分钟前   ❤️ 1
    "然后 EntryType 实现的转换操作里做了一堆骚操作": 所以还是实现 EntryType 的人的问题么。 你 hold 不住就不要用这么高级的特性么,当作 c with class 来写不就可以了么
    xdeng
        6
    xdeng  
       21 小时 58 分钟前
    C++ 越来越看不懂,语法越新越看不懂,学学 go 吧
    jeffw
        7
    jeffw  
       21 小时 53 分钟前
    重载了等号操作符?感觉没啥毛病
    levelworm
        8
    levelworm  
       21 小时 53 分钟前 via iPhone
    我只会写 C+class 。最爽的是用 std::unordered_map
    dandeli0n
        9
    dandeli0n  
       21 小时 49 分钟前
    其实编程语言的隐式转换都是坑,不信你看一下 js
    whenov
        10
    whenov  
       21 小时 46 分钟前
    这不是应该看 EntryType 的构造函数吗
    allentsau
        11
    allentsau  
       21 小时 45 分钟前 via Android
    C11
    jqknono
        12
    jqknono  
       21 小时 0 分钟前
    写了十几年 c++, 仍然觉得恶心, c++本身语法就繁杂, 那种很简洁的 c++只存在于各种书本里. 实际上的代码五花八门. 而且经常不得不去学习 cmake,makefile,gcc,gdb,microcode, 这里边每一个都很恶心, 宏也非常恶心. 总之它可能本身可以写的很优雅, 但是它允许各路人马以各种恶心的方式完成工作, 最气人的是没 bug 能跑, 就是人很难直接看懂. 可以说是一门标准的安卓语言.
    zhouyin
        13
    zhouyin  
       20 小时 53 分钟前
    @jqknono
    待遇咋样?
    我十几年前还看过 c++作者吹嘘维护 cpp 代码 待遇高
    cbythe434
        14
    cbythe434  
       20 小时 48 分钟前
    php 是世界上最好的语言
    givenge
        15
    givenge  
       20 小时 42 分钟前   ❤️ 5
    daokedao
        16
    daokedao  
       20 小时 39 分钟前
    Rust 现在怎么样了?要不要转 Rust ?或者 Mojo ?
    chutianyao
        17
    chutianyao  
       15 小时 52 分钟前   ❤️ 1
    这不是你自己的问题么

    static EntryType Graph::getEntryPoint() { return "_start"; }

    函数返回的"_start"是 String 类型, 你又声明需要 EntryType 类型, 自然就做了隐式转换.
    就像楼上说的, 你的 EntryType 如果有 String 类型的构造函数, 自然就能编译通过(转换成 EntryType 类型); 如果不支持, 编译失败你都没机会跑这段代码.

    大概率就是你的 EntryType 构造函数瞎搞, 鬼知道他会把 String 类型的值转换成啥
    Tomfe
        18
    Tomfe  
       13 小时 22 分钟前
    @levelworm 做硬件的吗
    Zenon
        19
    Zenon  
       13 小时 7 分钟前
    不懂,这不是很合理吗
    moudy
        20
    moudy  
    OP
       11 小时 52 分钟前   ❤️ 1
    @chutianyao 这是别人写的代码。如果 c++要求写 return EntryType("_start"); 用户起码知道这里可能会有坑。

    还有代码写 result = xxxx(); if(result.second) result->second(); 你问这俩 second 有啥区别,呵呵,->被重载了,你猜去吧。

    代码光读是没用的,每个符号都 tm 可能是别的意思。挂着 debugger 一层一层往里跟进,就跟解剖一具尸体看肠子里吃的是啥一样。
    thiiadoewjwe
        21
    thiiadoewjwe  
       10 小时 13 分钟前
    C++确实太恶心了,以及各种库的适配,版本问题,动态库链接的问题...让人头大
    moudy
        22
    moudy  
    OP
       7 小时 11 分钟前
    @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
    levelworm
        23
    levelworm  
       6 小时 34 分钟前
    @Tomfe #18
    大佬,我不是做硬件的,就是业余爱好写点底层的代码。
    qiany
        24
    qiany  
       6 小时 23 分钟前
    Javaer 吓哭了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1111 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    ♥ Do have faith in what you're doing.