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

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

  •  
  •   James369 · 2020-11-11 10:22:38 +08:00 · 7924 次点击
    这是一个创建于 1475 天前的主题,其中的信息可能已经有所发展或是发生改变。
    c++从 03 到 11,到 14,到 17,再到 20,发展越来越快。这门语言的好处是性能强、跨平台、面向对象,通用的现代语言。
    但我认为对于后来者想学习的话,应该是有优势的,可以抛弃一些历史包袱,从最新的开始学。
    C++是越来越复杂了,还是越来越好用了呢?
    第 1 条附言  ·  2020-11-11 16:22:09 +08:00
    除了语言特性之外,还应该分析一个语言周边生态,比如函数库、工具、各类框架、开源代码、甚至应用生态等。
    44 条回复    2020-11-13 11:52:49 +08:00
    across
        1
    across  
       2020-11-11 10:29:22 +08:00
    首先,C++不是 Python,学习路线就是从 03 一路学到 14,再之后看你用不用得上了。
    linux40
        2
    linux40  
       2020-11-11 10:30:43 +08:00
    不是能不能,而是最好直接从 20 开始。
    jjianwen68
        3
    jjianwen68  
       2020-11-11 10:36:07 +08:00
    但很多实际需要 c++的,还不会直接使用 c++20,一般还是没有使用这么新的编译器
    tianshilei1992
        4
    tianshilei1992  
       2020-11-11 10:37:05 +08:00
    越来越复杂是真的,越来越好用也是真的。要真想深学 C++,基础的那些东西(比如对象模型)还是少不了的,但是这些东西又和哪一代 C++ 没有太大的关系。新特性更多的是语法糖还有更加完善的 STL 而已。
    James369
        5
    James369  
    OP
       2020-11-11 10:40:30 +08:00
    @across 看来还是要有选择性的学,或者把 C++当手册看,用的时候再学学。
    luoqeng
        6
    luoqeng  
       2020-11-11 10:45:08 +08:00
    完全可以
    tamlok
        7
    tamlok  
       2020-11-11 10:47:59 +08:00 via Android
    不能~编译器都支持了吗?
    llvm98
        8
    llvm98  
       2020-11-11 11:06:23 +08:00   ❤️ 1
    我个人感觉的话,如果 C++ 想学明白,历史包袱是很难避免的(除了一些语法糖),不过还是要看自己的学习方法,的确有些人是把 C++ 当 Python 学,尤其是一些参加竞赛的同学,先用熟 API 再深入学习,也学的很好,但我自己经验来讲,学了 C 和操作系统之后,再按自己需求去一点一点地学 C++ 就会感觉比较自然。不过话说回来,按版本学的我还没怎么见过,哈哈哈
    gainsurier
        9
    gainsurier  
       2020-11-11 11:18:00 +08:00   ❤️ 1
    C++ Primer 第 6 版快来了,基于 20
    Alexhohom
        10
    Alexhohom  
       2020-11-11 11:33:25 +08:00
    并不能
    Wirbelwind
        11
    Wirbelwind  
       2020-11-11 12:07:23 +08:00
    可以 不要写 oop
    Cbdy
        12
    Cbdy  
       2020-11-11 12:09:58 +08:00
    首先,你要找到一个编译器支持 C++20
    raaaaaar
        13
    raaaaaar  
       2020-11-11 12:10:05 +08:00 via Android
    。。我就刷刷算法题,就调调 API,真 c with class 。。
    wtsamuel
        14
    wtsamuel  
       2020-11-11 12:33:10 +08:00
    你只要吧 c++ 当作 c with class,哪个版本都好用
    cmdOptionKana
        15
    cmdOptionKana  
       2020-11-11 12:42:28 +08:00
    学习可以,但具体工作的时候还是看项目的历史包袱。
    Tony042
        16
    Tony042  
       2020-11-11 13:00:23 +08:00
    C++学 17,但是主要学 11,20 的话各大编译器支持还不完全
    ppphp
        17
    ppphp  
       2020-11-11 13:00:37 +08:00
    真想学好可以直接从 rust 开始。。。
    newmlp
        18
    newmlp  
       2020-11-11 13:02:18 +08:00
    没问题,如果仅仅是自己学一下
    luplus
        19
    luplus  
       2020-11-11 13:20:17 +08:00
    现在 11 用的最多,20 不知道要多久才能用上,而且都是一些特性的改变,你把前面基础弄扎实,其他的都好说
    songtinhuang
        20
    songtinhuang  
       2020-11-11 13:34:08 +08:00
    先探索探索可行性。
    Cpp20 估计不行,要等 GCC 或者 clang 或者 MSVC 哪家先支持完整的 CPP20 。
    另外,C++之父是建议先学 modern cpp 的。我推荐你从 17 开始。
    xdeng
        21
    xdeng  
       2020-11-11 13:48:23 +08:00
    使用过程中 难免会遇到 C89 等旧的库的。
    GromHellscream
        22
    GromHellscream  
       2020-11-11 13:50:18 +08:00
    我是从 11 开始学的
    Stoulla
        23
    Stoulla  
       2020-11-11 14:21:27 +08:00 via Android
    建议从 14 或者 11 开始学
    nicebird
        24
    nicebird  
       2020-11-11 14:31:38 +08:00
    11 开始会好点,用的比较广。
    ysc3839
        25
    ysc3839  
       2020-11-11 14:39:03 +08:00   ❤️ 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  
       2020-11-11 15:27:37 +08:00 via Android
    @ysc3839
    学到了。
    请问这类新特性有什么好的参考吗?有书或者文档推荐吗?
    rogerchen
        27
    rogerchen  
       2020-11-11 15:43:29 +08:00
    @ysc3839 result.data() 就只在 since 17 until 20 这一个小时间窗口里返回了一个可写的 CharT*,之前是 const CharT*,之后是 constexpr CharT*,怕是都不能用你这个方法了。至于 &string[0],只要 cpp 还是 zero overhead,C++哪个版本都可以怒草类型系统。
    ysc3839
        28
    ysc3839  
       2020-11-11 16:18:56 +08:00 via Android
    @Cryse 我好像没看过专门讲解新特性的书籍或者文档,基本都是从别的项目或者 en.cppreference.com 了解到的。
    如果要推荐的话可以看看这个 https://changkun.de/modern-cpp/
    ysc3839
        29
    ysc3839  
       2020-11-11 16:23:19 +08:00 via Android
    @rogerchen constexpr 修饰的是函数,不是返回值类型,返回值类型还是 CharT*。
    至于 &string[0],Stack Overflow 上的说法是因为 C++11 之前标准没有规定一定要连续存储,(&string[0]) + 1 不一定等于 &string[1],并不保证可用。
    johnli
        30
    johnli  
       2020-11-11 17:49:15 +08:00   ❤️ 2
    @ppphp 想起来这个图片,太艹了。。。
    ![]( https://imgur.com/bg9gCfV)
    GeruzoniAnsasu
        31
    GeruzoniAnsasu  
       2020-11-11 18:50:48 +08:00
    @johnli hhh 其实还挺科学的,毕竟 rust 是最新的“想要集大成”的复杂语言,跟 c++努力方向一致
    liuguangxuan
        32
    liuguangxuan  
       2020-11-11 19:10:03 +08:00 via Android
    @gainsurier 哪里看到的消息,老哥。
    52coder
        33
    52coder  
       2020-11-11 19:13:03 +08:00
    @raaaaaar 一样,工作了都一样
    Jirajine
        34
    Jirajine  
       2020-11-11 19:19:01 +08:00 via Android   ❤️ 1
    照你这样说直接学 rust 就完了,cpp 一路都是缝合过来的。
    owt5008137
        35
    owt5008137  
       2020-11-11 23:27:16 +08:00 via Android
    不能。
    目前基本上没有支持 c++20 特性的生产环境。
    目前还没有哪个编译器能完整支持 c++20 。
    目前还没有哪个编译器对 c++20 支持的特性完全进入了非体验阶段。
    C++20 很多设计也是有历史包袱的,而且也是为了解决之前的问题,不了解一下根本不知道为嘛现在设计成这样。
    如果想要完全丢弃历史包袱,不如就像上面很多人说的直接学 Rust
    neoblackcap
        36
    neoblackcap  
       2020-11-12 03:29:42 +08:00
    @songtinhuang 最快应该是 clang 吧,我看他们挺积极的。不过嘛,完整支持就不好说。我看历来都有各种各样的特性不会被实现
    js8510
        37
    js8510  
       2020-11-12 04:57:30 +08:00   ❤️ 1
    我是在现在公司入职后学的 C++,我也在内部问过类似问题。不同大佬给了我不同甚至相反的意见。C++ 真的 很特别,你要问 best practices 或者 principle, 其他语言一般都有一致的答案,但是 c++往往会出现分歧。我的建议是看看就好,凭自己感觉选在。重点是开始做。


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