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

想学 C++,能不能直接从最新的 C++20 开始?

  •  
  •   James369 · 181 天前 · 4506 次点击
    这是一个创建于 181 天前的主题,其中的信息可能已经有所发展或是发生改变。
    c++从 03 到 11,到 14,到 17,再到 20,发展越来越快。这门语言的好处是性能强、跨平台、面向对象,通用的现代语言。
    但我认为对于后来者想学习的话,应该是有优势的,可以抛弃一些历史包袱,从最新的开始学。
    C++是越来越复杂了,还是越来越好用了呢?
    第 1 条附言  ·  181 天前
    除了语言特性之外,还应该分析一个语言周边生态,比如函数库、工具、各类框架、开源代码、甚至应用生态等。
    44 条回复    2020-11-13 11:52:49 +08:00
    across
        1
    across   181 天前
    首先,C++不是 Python,学习路线就是从 03 一路学到 14,再之后看你用不用得上了。
    linux40
        2
    linux40   181 天前
    不是能不能,而是最好直接从 20 开始。
    jjianwen68
        3
    jjianwen68   181 天前
    但很多实际需要 c++的,还不会直接使用 c++20,一般还是没有使用这么新的编译器
    tianshilei1992
        4
    tianshilei1992   181 天前
    越来越复杂是真的,越来越好用也是真的。要真想深学 C++,基础的那些东西(比如对象模型)还是少不了的,但是这些东西又和哪一代 C++ 没有太大的关系。新特性更多的是语法糖还有更加完善的 STL 而已。
    James369
        5
    James369   181 天前
    @across 看来还是要有选择性的学,或者把 C++当手册看,用的时候再学学。
    luoqeng
        6
    luoqeng   181 天前
    完全可以
    tamlok
        7
    tamlok   181 天前 via Android
    不能~编译器都支持了吗?
    llvm98
        8
    llvm98   181 天前   ❤️ 1
    我个人感觉的话,如果 C++ 想学明白,历史包袱是很难避免的(除了一些语法糖),不过还是要看自己的学习方法,的确有些人是把 C++ 当 Python 学,尤其是一些参加竞赛的同学,先用熟 API 再深入学习,也学的很好,但我自己经验来讲,学了 C 和操作系统之后,再按自己需求去一点一点地学 C++ 就会感觉比较自然。不过话说回来,按版本学的我还没怎么见过,哈哈哈
    gainsurier
        9
    gainsurier   181 天前
    C++ Primer 第 6 版快来了,基于 20
    Alexhohom
        10
    Alexhohom   181 天前
    并不能
    Wirbelwind
        11
    Wirbelwind   181 天前
    可以 不要写 oop
    Cbdy
        12
    Cbdy   181 天前
    首先,你要找到一个编译器支持 C++20
    raaaaaar
        13
    raaaaaar   181 天前 via Android
    。。我就刷刷算法题,就调调 API,真 c with class 。。
    wtsamuel
        14
    wtsamuel   181 天前
    你只要吧 c++ 当作 c with class,哪个版本都好用
    cmdOptionKana
        15
    cmdOptionKana   181 天前
    学习可以,但具体工作的时候还是看项目的历史包袱。
    Tony042
        16
    Tony042   181 天前
    C++学 17,但是主要学 11,20 的话各大编译器支持还不完全
    ppphp
        17
    ppphp   181 天前
    真想学好可以直接从 rust 开始。。。
    newmlp
        18
    newmlp   181 天前
    没问题,如果仅仅是自己学一下
    luplus
        19
    luplus   181 天前
    现在 11 用的最多,20 不知道要多久才能用上,而且都是一些特性的改变,你把前面基础弄扎实,其他的都好说
    songtinhuang
        20
    songtinhuang   181 天前
    先探索探索可行性。
    Cpp20 估计不行,要等 GCC 或者 clang 或者 MSVC 哪家先支持完整的 CPP20 。
    另外,C++之父是建议先学 modern cpp 的。我推荐你从 17 开始。
    xdeng
        21
    xdeng   181 天前
    使用过程中 难免会遇到 C89 等旧的库的。
    GromHellscream
        22
    GromHellscream   181 天前
    我是从 11 开始学的
    Stoulla
        23
    Stoulla   181 天前 via Android
    建议从 14 或者 11 开始学
    nicebird
        24
    nicebird   181 天前
    11 开始会好点,用的比较广。
    ysc3839
        25
    ysc3839   181 天前   ❤️ 1
    个人项目的话是应该的,许多特性用起来挺爽的。

    举个典型例子:调用一些库,需要传递一个 buffer 进去接收字符串并保存到 std::string 的情景。
    以前经常看到这种写法:
    auto len = get_string_length();
    char* buffer = new char[len];
    get_string(buffer);
    std::string result(buffer, len);
    delete[] buffer;
    return result;

    但是从 C++ 17 开始,可以这么写:
    auto len = get_string_length();
    std::string result;
    result.resize(len);
    get_string(result.data());
    return result;

    后者与前者相比:代码更加简洁,少了一次拷贝,不需要手动释放内存,在遇到异常时不会导致内存泄漏。
    另外按照 Stack Overflow 上的说法,自 C++11 开始就能用这种方法了,要把 string.data() 换成 &string[0]
    https://stackoverflow.com/questions/1042940/writing-directly-to-stdstring-internal-buffers
    Cryse
        26
    Cryse   181 天前 via Android
    @ysc3839
    学到了。
    请问这类新特性有什么好的参考吗?有书或者文档推荐吗?
    rogerchen
        27
    rogerchen   181 天前
    @ysc3839 result.data() 就只在 since 17 until 20 这一个小时间窗口里返回了一个可写的 CharT*,之前是 const CharT*,之后是 constexpr CharT*,怕是都不能用你这个方法了。至于 &string[0],只要 cpp 还是 zero overhead,C++哪个版本都可以怒草类型系统。
    ysc3839
        28
    ysc3839   181 天前 via Android
    @Cryse 我好像没看过专门讲解新特性的书籍或者文档,基本都是从别的项目或者 en.cppreference.com 了解到的。
    如果要推荐的话可以看看这个 https://changkun.de/modern-cpp/
    ysc3839
        29
    ysc3839   181 天前 via Android
    @rogerchen constexpr 修饰的是函数,不是返回值类型,返回值类型还是 CharT*。
    至于 &string[0],Stack Overflow 上的说法是因为 C++11 之前标准没有规定一定要连续存储,(&string[0]) + 1 不一定等于 &string[1],并不保证可用。
    johnli
        30
    johnli   181 天前   ❤️ 2
    @ppphp 想起来这个图片,太艹了。。。
    ![]( https://imgur.com/bg9gCfV)
    GeruzoniAnsasu
        31
    GeruzoniAnsasu   181 天前
    @johnli hhh 其实还挺科学的,毕竟 rust 是最新的“想要集大成”的复杂语言,跟 c++努力方向一致
    liuguangxuan
        32
    liuguangxuan   181 天前 via Android
    @gainsurier 哪里看到的消息,老哥。
    52coder
        33
    52coder   181 天前
    @raaaaaar 一样,工作了都一样
    Jirajine
        34
    Jirajine   181 天前 via Android   ❤️ 1
    照你这样说直接学 rust 就完了,cpp 一路都是缝合过来的。
    owt5008137
        35
    owt5008137   181 天前 via Android
    不能。
    目前基本上没有支持 c++20 特性的生产环境。
    目前还没有哪个编译器能完整支持 c++20 。
    目前还没有哪个编译器对 c++20 支持的特性完全进入了非体验阶段。
    C++20 很多设计也是有历史包袱的,而且也是为了解决之前的问题,不了解一下根本不知道为嘛现在设计成这样。
    如果想要完全丢弃历史包袱,不如就像上面很多人说的直接学 Rust
    neoblackcap
        36
    neoblackcap   181 天前
    @songtinhuang 最快应该是 clang 吧,我看他们挺积极的。不过嘛,完整支持就不好说。我看历来都有各种各样的特性不会被实现
    js8510
        37
    js8510   181 天前   ❤️ 1
    我是在现在公司入职后学的 C++,我也在内部问过类似问题。不同大佬给了我不同甚至相反的意见。C++ 真的 很特别,你要问 best practices 或者 principle, 其他语言一般都有一致的答案,但是 c++往往会出现分歧。我的建议是看看就好,凭自己感觉选在。重点是开始做。


    以我学习不同语言的经验,我当时就直接开始做。写代码,开始是内部课程的作业,找组里的人给我 code review. 然后是一些简单的业务逻辑,有其他人给我 reivew 慢慢就上手了。
    PepperEgg
        38
    PepperEgg   180 天前
    11 起步。20 太新,没有多少编译器支持全部特性。另外 17 也是不错的选择。
    auto8888
        39
    auto8888   180 天前
    建议 C11 关键是看你的使用场景
    lonelygo
        40
    lonelygo   180 天前
    并不能,17 对于大多数生产项目来说“已经够新了”。
    祖传代码 11 的还有很多。
    所以,11 开始吧
    lonewolfakela
        41
    lonewolfakela   180 天前
    @neoblackcap 按照 https://en.cppreference.com/w/cpp/compiler_support 这里给出的信息,gcc 、clang 、msvc 三家里,clang 的进度是最慢的一个……
    shfanzie
        42
    shfanzie   180 天前
    从 11 开始学
    neoblackcap
        43
    neoblackcap   180 天前
    @lonewolfakela 我感觉里面的缺的特性更像 clang 不会去实现了
    lzhCoooder
        44
    lzhCoooder   179 天前
    c++11 都成祖传代码了.... 看你需求了我有些.cc .cpp 直接改名.c 都能编译,我觉得 c++11 和 c99 已经足够了
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1635 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:11 · PVG 08:11 · LAX 17:11 · JFK 20:11
    ♥ Do have faith in what you're doing.