跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 想学 C++,能不能直接从最新的 C++20 开始?
未分類
31 10 月 2020

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

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

資深大佬 : James369 4

c++从 03 到 11,到 14,到 17,再到 20,发展越来越快。这门语言的好处是性能强、跨平台、面向对象,通用的现代语言。
但我认为对于后来者想学习的话,应该是有优势的,可以抛弃一些历史包袱,从最新的开始学。
C++是越来越复杂了,还是越来越好用了呢?
大佬有話說 (44)

  • 資深大佬 : across

    首先,C++不是 Python,学习路线就是从 03 一路学到 14,再之后看你用不用得上了。

  • 資深大佬 : linux40

    不是能不能,而是最好直接从 20 开始。

  • 資深大佬 : jjianwen68

    但很多实际需要 c++的,还不会直接使用 c++20,一般还是没有使用这么新的编译器

  • 資深大佬 : tianshilei1992

    越来越复杂是真的,越来越好用也是真的。要真想深学 C++,基础的那些东西(比如对象模型)还是少不了的,但是这些东西又和哪一代 C++ 没有太大的关系。新特性更多的是语法糖还有更加完善的 STL 而已。

  • 主 資深大佬 : James369

    @across 看来还是要有选择性的学,或者把 C++当手册看,用的时候再学学。

  • 資深大佬 : luoqeng

    完全可以

  • 資深大佬 : tamlok

    不能~编译器都支持了吗?

  • 資深大佬 : llvm98

    我个人感觉的话,如果 C++ 想学明白,历史包袱是很难避免的(除了一些语法糖),不过还是要看自己的学习方法,的确有些人是把 C++ 当 Python 学,尤其是一些参加竞赛的同学,先用熟 API 再深入学习,也学的很好,但我自己经验来讲,学了 C 和操作系统之后,再按自己需求去一点一点地学 C++ 就会感觉比较自然。不过话说回来,按版本学的我还没怎么见过,哈哈哈

  • 資深大佬 : gainsurier

    C++ Primer 第 6 版快来了,基于 20

  • 資深大佬 : Alexhohom

    并不能

  • 資深大佬 : Wirbelwind

    可以 不要写 oop

  • 資深大佬 : Cbdy

    首先,你要找到一个编译器支持 C++20

  • 資深大佬 : raaaaaar

    。。我就刷刷算法题,就调调 API,真 c with class 。。

  • 資深大佬 : wtsamuel

    你只要吧 c++ 当作 c with class,哪个版本都好用

  • 資深大佬 : cmdOptionKana

    学习可以,但具体工作的时候还是看项目的历史包袱。

  • 資深大佬 : Tony042

    C++学 17,但是主要学 11,20 的话各大编译器支持还不完全

  • 資深大佬 : ppphp

    真想学好可以直接从 rust 开始。。。

  • 資深大佬 : newmlp

    没问题,如果仅仅是自己学一下

  • 資深大佬 : luplus

    现在 11 用的最多,20 不知道要多久才能用上,而且都是一些特性的改变,你把前面基础弄扎实,其他的都好说

  • 資深大佬 : songtinhuang

    先探索探索可行性。
    Cpp20 估计不行,要等 GCC 或者 clang 或者 MSVC 哪家先支持完整的 CPP20 。
    另外,C++之父是建议先学 modern cpp 的。我推荐你从 17 开始。

  • 資深大佬 : xdeng

    使用过程中 难免会遇到 C89 等旧的库的。

  • 資深大佬 : GromHellscream

    我是从 11 开始学的

  • 資深大佬 : Stoulla

    建议从 14 或者 11 开始学

  • 資深大佬 : nicebird

    11 开始会好点,用的比较广。

  • 資深大佬 : ysc3839

    个人项目的话是应该的,许多特性用起来挺爽的。

    举个典型例子:调用一些库,需要传递一个 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

    @ysc3839
    学到了。
    请问这类新特性有什么好的参考吗?有书或者文档推荐吗?

  • 資深大佬 : rogerchen

    @ysc3839 result.data() 就只在 since 17 until 20 这一个小时间窗口里返回了一个可写的 CharT*,之前是 const CharT*,之后是 constexpr CharT*,怕是都不能用你这个方法了。至于 &string[0],只要 cpp 还是 zero overhead,C++哪个版本都可以怒草类型系统。

  • 資深大佬 : ysc3839

    @Cryse 我好像没看过专门讲解新特性的书籍或者文档,基本都是从别的项目或者 en.cppreference.com 了解到的。
    如果要推荐的话可以看看这个 https://changkun.de/modern-cpp/

  • 資深大佬 : ysc3839

    @rogerchen constexpr 修饰的是函数,不是返回值类型,返回值类型还是 CharT*。
    至于 &string[0],Stack Overflow 上的说法是因为 C++11 之前标准没有规定一定要连续存储,(&string[0]) + 1 不一定等于 &string[1],并不保证可用。

  • 資深大佬 : johnli

    @ppphp 想起来这个图片,太艹了。。。
    ![]( https://imgur.com/bg9gCfV)

  • 資深大佬 : GeruzoniAnsasu

    @johnli hhh 其实还挺科学的,毕竟 rust 是最新的“想要集大成”的复杂语言,跟 c++努力方向一致

  • 資深大佬 : liuguangxuan

    @gainsurier 哪里看到的消息,老哥。

  • 資深大佬 : 52coder

    @raaaaaar 一样,工作了都一样

  • 資深大佬 : Jirajine

    照你这样说直接学 rust 就完了,cpp 一路都是缝合过来的。

  • 資深大佬 : owt5008137

    不能。
    目前基本上没有支持 c++20 特性的生产环境。
    目前还没有哪个编译器能完整支持 c++20 。
    目前还没有哪个编译器对 c++20 支持的特性完全进入了非体验阶段。
    C++20 很多设计也是有历史包袱的,而且也是为了解决之前的问题,不了解一下根本不知道为嘛现在设计成这样。
    如果想要完全丢弃历史包袱,不如就像上面很多人说的直接学 Rust

  • 資深大佬 : neoblackcap

    @songtinhuang 最快应该是 clang 吧,我看他们挺积极的。不过嘛,完整支持就不好说。我看历来都有各种各样的特性不会被实现

  • 資深大佬 : js8510

    我是在现在公司入职后学的 C++,我也在内部问过类似问题。不同大佬给了我不同甚至相反的意见。C++ 真的 很特别,你要问 best practices 或者 principle, 其他语言一般都有一致的答案,但是 c++往往会出现分歧。我的建议是看看就好,凭自己感觉选在。重点是开始做。

    以我学习不同语言的经验,我当时就直接开始做。写代码,开始是内部课程的作业,找组里的人给我 code review. 然后是一些简单的业务逻辑,有其他人给我 reivew 慢慢就上手了。

  • 資深大佬 : PepperEgg

    11 起步。20 太新,没有多少编译器支持全部特性。另外 17 也是不错的选择。

  • 資深大佬 : auto8888

    建议 C11 关键是看你的使用场景

  • 資深大佬 : lonelygo

    并不能,17 对于大多数生产项目来说“已经够新了”。
    祖传代码 11 的还有很多。
    所以,11 开始吧

  • 資深大佬 : lonewolfakela

    @neoblackcap 按照 https://en.cppreference.com/w/cpp/compiler_support 这里给出的信息,gcc 、clang 、msvc 三家里,clang 的进度是最慢的一个……

  • 資深大佬 : shfanzie

    从 11 开始学

  • 資深大佬 : neoblackcap

    @lonewolfakela 我感觉里面的缺的特性更像 clang 不会去实现了

  • 資深大佬 : lzhCoooder

    c++11 都成祖传代码了…. 看你需求了我有些.cc .cpp 直接改名.c 都能编译,我觉得 c++11 和 c99 已经足够了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具