想学 C++,能不能直接从最新的 C++20 开始? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
James369
V2EX    程序员

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

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


以我学习不同语言的经验,我当时就直接开始做。写代码,开始是内部课程的作业,找组里的人给我 code review. 然后是一些简单的业务逻辑,有其他人给我 reivew 慢慢就上手了。
PepperEgg
    38
PepperEgg  
   2020 年 11 月 12 日
11 起步。20 太新,没有多少编译器支持全部特性。另外 17 也是不错的选择。
auto8888
    39
auto8888  
   2020 年 11 月 12 日
建议 C11 关键是看你的使用场景
lonelygo
    40
lonelygo  
   2020 年 11 月 12 日
并不能,17 对于大多数生产项目来说“已经够新了”。
祖传代码 11 的还有很多。
所以,11 开始吧
lonewolfakela
    41
lonewolfakela  
   2020 年 11 月 12 日
@neoblackcap 按照 https://en.cppreference.com/w/cpp/compiler_support 这里给出的信息,gcc 、clang 、msvc 三家里,clang 的进度是最慢的一个……
shfanzie
    42
shfanzie  
   2020 年 11 月 12 日
从 11 开始学
neoblackcap
    43
neoblackcap  
   2020 年 1 月 12 日
@lonewolfakela 我感觉里面的缺的特性更像 clang 不会去实现了
lzhCoooder
    44
lzhCoooder  
   2020 年 11 月 13 日
c++11 都成祖传代码了.... 看你需求了我有些.cc .cpp 直接改名.c 都能编译,我觉得 c++11 和 c99 已经足够了
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2661 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 37ms UTC 15:27 PVG 23:27 LAX 07:27 JFK 10:27
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86