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

2020-11-11 10:22:38 +08:00
 James369
c++从 03 到 11,到 14,到 17,再到 20,发展越来越快。这门语言的好处是性能强、跨平台、面向对象,通用的现代语言。
但我认为对于后来者想学习的话,应该是有优势的,可以抛弃一些历史包袱,从最新的开始学。
C++是越来越复杂了,还是越来越好用了呢?
7586 次点击
所在节点    程序员
44 条回复
xdeng
2020-11-11 13:48:23 +08:00
使用过程中 难免会遇到 C89 等旧的库的。
GromHellscream
2020-11-11 13:50:18 +08:00
我是从 11 开始学的
Stoulla
2020-11-11 14:21:27 +08:00
建议从 14 或者 11 开始学
nicebird
2020-11-11 14:31:38 +08:00
11 开始会好点,用的比较广。
ysc3839
2020-11-11 14:39:03 +08:00
个人项目的话是应该的,许多特性用起来挺爽的。

举个典型例子:调用一些库,需要传递一个 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
2020-11-11 15:27:37 +08:00
@ysc3839
学到了。
请问这类新特性有什么好的参考吗?有书或者文档推荐吗?
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
2020-11-11 16:18:56 +08:00
@Cryse 我好像没看过专门讲解新特性的书籍或者文档,基本都是从别的项目或者 en.cppreference.com 了解到的。
如果要推荐的话可以看看这个 https://changkun.de/modern-cpp/
ysc3839
2020-11-11 16:23:19 +08:00
@rogerchen constexpr 修饰的是函数,不是返回值类型,返回值类型还是 CharT*。
至于 &string[0],Stack Overflow 上的说法是因为 C++11 之前标准没有规定一定要连续存储,(&string[0]) + 1 不一定等于 &string[1],并不保证可用。
johnli
2020-11-11 17:49:15 +08:00
@ppphp 想起来这个图片,太艹了。。。
![]( https://imgur.com/bg9gCfV)
GeruzoniAnsasu
2020-11-11 18:50:48 +08:00
@johnli hhh 其实还挺科学的,毕竟 rust 是最新的“想要集大成”的复杂语言,跟 c++努力方向一致
liuguangxuan
2020-11-11 19:10:03 +08:00
@gainsurier 哪里看到的消息,老哥。
52coder
2020-11-11 19:13:03 +08:00
@raaaaaar 一样,工作了都一样
Jirajine
2020-11-11 19:19:01 +08:00
照你这样说直接学 rust 就完了,cpp 一路都是缝合过来的。
owt5008137
2020-11-11 23:27:16 +08:00
不能。
目前基本上没有支持 c++20 特性的生产环境。
目前还没有哪个编译器能完整支持 c++20 。
目前还没有哪个编译器对 c++20 支持的特性完全进入了非体验阶段。
C++20 很多设计也是有历史包袱的,而且也是为了解决之前的问题,不了解一下根本不知道为嘛现在设计成这样。
如果想要完全丢弃历史包袱,不如就像上面很多人说的直接学 Rust
neoblackcap
2020-11-12 03:29:42 +08:00
@songtinhuang 最快应该是 clang 吧,我看他们挺积极的。不过嘛,完整支持就不好说。我看历来都有各种各样的特性不会被实现
js8510
2020-11-12 04:57:30 +08:00
我是在现在公司入职后学的 C++,我也在内部问过类似问题。不同大佬给了我不同甚至相反的意见。C++ 真的 很特别,你要问 best practices 或者 principle, 其他语言一般都有一致的答案,但是 c++往往会出现分歧。我的建议是看看就好,凭自己感觉选在。重点是开始做。


以我学习不同语言的经验,我当时就直接开始做。写代码,开始是内部课程的作业,找组里的人给我 code review. 然后是一些简单的业务逻辑,有其他人给我 reivew 慢慢就上手了。
PepperEgg
2020-11-12 09:00:09 +08:00
11 起步。20 太新,没有多少编译器支持全部特性。另外 17 也是不错的选择。
auto8888
2020-11-12 09:09:31 +08:00
建议 C11 关键是看你的使用场景
lonelygo
2020-11-12 10:02:57 +08:00
并不能,17 对于大多数生产项目来说“已经够新了”。
祖传代码 11 的还有很多。
所以,11 开始吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX