给自己看的。
我的情况:从 C++ Primer 第五版 入门,该版基于C++11,但不是专门讲C++11的,只提到了部分相关内容。后来自己看过一些介绍 C++11相关的书,查过一些资料。14/17没去了解过。
从17开始,再到14,再到11
17
// 似乎正式标准还发没出来
// 这里应该算是draft吧,N4640目前是最新的?
http://www.open-std.org/JTC1/SC22/WG21/
https://github.com/cplusplus/draft
//
https://www.meetingcpp.com/blog/items/final-features-of-c17.html
// 这个好
http://geek.csdn.net/news/detail/228484C++17
// 这个里面的链接可以点的。。。
http://blog.csdn.net/fesdobat/article/details/75154004?locationNum=2&fps=1
// 这个就列举了一下名字。。
http://c.tedu.cn/kbsk/224822.html
// 维基百科,应该算比较新的吧?
https://en.wikipedia.org/wiki/C%2B%2B17
// 知乎大神 蓝色 的专栏
// 应该还会有新的发出来
https://zhuanlan.zhihu.com/p/25434012
https://zhuanlan.zhihu.com/p/25855097
https://zhuanlan.zhihu.com/p/26920039
// 这个一大堆,也不知道是不是大部分都砍掉了
// 但是每个都附上了openstd的提案,建议看这个
http://blog.jobbole.com/111801/
// module似乎已经砍掉了
https://www.zhihu.com/question/37330979/answer/73595024
// 知乎大神 蓝色 的演讲
// 相关的module,concept 已经砍掉
https://github.com/FrozenGene/presentation/blob/master/pdf/C%2B%2B17%E6%96%B0%E7%89%B9%E6%80%A7%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%94%B9%E5%96%84%E5%92%8C%E5%BD%B1%E5%93%8D.pdf
// auto配大括号初始化的规定,上面 知乎 蓝色 的专栏也提到了
// 没有 蓝色 的写的全,不如看蓝色的,因为还有几种禁用的
http://blog.csdn.net/zwvista/article/details/53812819
// fold expression折叠表达式,讲到了默认值
// 看这个吧
http://blog.csdn.net/zwvista/article/details/53981696
// structured binding declaration 结构化绑定声明
// 一次声明和初始化多个变量
http://blog.csdn.net/zwvista/article/details/78111346
// 基于区间的for循环
// 以前默认使用begin(),end(),类型要一样,现在可以不用了,但是也要begin(),end(),类型可以不一样,需要提供operator!= ( BEGIN_TYPE,END_TYPE)
// 具体的看文章里写的for循环展开成什么样就懂了
http://blog.csdn.net/zwvista/article/details/52304605
// 这里提到了理由
// 认为过去的for区间循环是 over-constrained,也就是说有不必要的约束条件
// end在过去只需要和begin比一比,不需要递增递减等各种操作,没必要约束其为iterator
https://stackoverflow.com/questions/39117330/how-the-new-range-based-for-loop-in-c17-helps-ranges-ts
// 允许嵌套的命名空间
// 。。。说实话这个戳到我痛点了,写N层命名空间,光说对齐都受不了
// 从标准上保证了某些情况下的copy elision
// wiki上的一条
https://en.wikipedia.org/wiki/C%2B%2B17
// if constexpr,似乎也没说清楚,这里的constexpr如果不是编译期可得怎么办,内部是否求值?这些问题
// 用最新版g++试了试, 必须提供编译期可得的值,所以求值不求值没什么所谓了?
// 似乎也不对,哪怕运行constexpr也有可能有副作用的吧?
// 试试,哦发现了。。标准里提了一句,constexpr内部可以使用生命期开始于函数之后的变量,所以副作用别人也看不到。。。无所谓了
// any
http://www.cnblogs.com/thinkway/p/6743772.html
http://en.cppreference.com/w/cpp/utility/any
// any_cast也要注意一点的,直接cast到右值,就被当右值用了,比如说下面这个例子
http://en.cppreference.com/w/cpp/utility/any/any_cast
// variant,可以看做类型安全的union
// 注意类型转换,里面提到了std::variant
http://en.cppreference.com/w/cpp/utility/variant
http://www.cnblogs.com/thinkway/p/6743684.html
// std::in_place, std::in_place_type, std::in_place_index,std::in_place_t , std::in_place_type_t, std::in_place_index_t这些
见cppreference里面单独的那一章,还有optional,variant,any的相关构造方式部分
http://en.cppreference.com/w/cpp/utility/in_place
还有我在知乎的提问和自问自答。。
https://www.zhihu.com/question/66032208/answer/237524884
// 标准库容器允许不完全类型,不确定是否写进标准了
https://www.zhihu.com/question/32222337?sort=created
// inline variable
// inline可以用在变量上了
见草案N4640 7.16
https://stackoverflow.com/questions/38043442/how-do-inline-variables-work
// lambda捕获this的一些新规定
// 以前是默认捕获this,访问成员也是使用默认捕获的this。
// 为了复制*this,以前需要使用一些绕弯子的做法,而且有一些弊端(见下面网页详述)
//现在可以选择 以传值方式捕获 *this,配合c++14 lambda可以在捕获列表那里使用初始化,用起来很舒服
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0018r3.html
// byte类型
// byte不允许数学运算,只允许位运算。专注于内存方面。将以前char , unsigned char类型的大杂烩职责 分离。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0298r3.pdf
http://en.cppreference.com/w/cpp/types/byte
https://www.zhihu.com/question/56607671
// optional类型
// 举例来说,以前用std::pair
// 现在可以用optional (类似variant
// 一个优点是,如果失败了就不必构造T了
14
//
https://news.cnblogs.com/n/503451/
//
http://blog.csdn.net/u012234115/article/details/47209679
// constexpr 函数不一定总是返回编译期结果。 这个以前还真没注意,想了想有道理,如果参数在编译期不可得,那肯定没法编译期计算
// 如果传了编译期无法得到的参数进去,不知道会怎么样
// 有说报错的,有说运行期计算的
https://www.zhihu.com/question/35614219
// constexpr变量一定是顶层const ?
// constexpr 更加易用
// 注意constexpr编译期和运行期代码统一
http://blog.csdn.net/zwvista/article/details/54429416
// constexpr 类成员函数不再默认const 等一些细节
// 官方
// 非官方,不确定正确与否
http://blog.csdn.net/yhl_leo/article/details/50864210
// 标准库允许提供 两个参数类型不同的比较函数了
// 详见,蓝形参的回答。
https://www.zhihu.com/question/22765983
// 这个人的博客,有一堆新特性的尝试
// 写的貌似不错
http://blog.csdn.net/zwvista/article/list/2
// 尤其是这个decltype decltype(auto)这篇
http://blog.csdn.net/zwvista/article/details/54571821
11
// 有助于理解lambda和各种类似作用的其他方法
// 注意里面用的是11正式出来之前写的0x标准
// 现在不仅11出来了,更新的14,17都有了。。。而且lambda许多方面都被修改的更易使用了
http://blog.csdn.net/zdy0_2004/article/details/50278819
// 这个直接转载的wiki。。。
http://blog.csdn.net/u012234115/article/details/47209625
// wiki c++11的比c++17长太多了哈哈哈
https://zh.wikipedia.org/wiki/C%2B%2B11#.E7.B7.92.E7.A8.8B.E6.94.AF.E6.8F.B4
// 线程、锁、原子类型、 。。。 这一大堆东西都不算熟悉,primer没怎么讲过。都是在别的地方陆陆续续看得,不成体系
// 一些基本概念都在上面几个有,详细的话,再找找
// cpp reference 就不错,比如说thread就那几个接口,概念也挺简单的
// 这个是cpp reference的 thread support ilbrary总览
http://en.cppreference.com/w/cpp/thread
// thread的构造函数里,args默认传值了,所以如果需要传给function的参数是引用, 注意用std::ref,std::cref包一下
// thread的静态函数成员, hardware_concurrency可以运行期获得硬件支持的并行数(比如4核就是4,提示说并不准,毕竟有很多现实问题,比如说以前见到过什么一个核可以当两个核用什么的。。。)
http://en.cppreference.com/w/cpp/thread/thread
// mutex
// 一般用RAII, 见
http://en.cppreference.com/w/cpp/thread/mutex/lock
// ...太多了,不一一记了。
// 反正就是把cpp reference的所有相关部分看一遍
// 基本上就是搜索出来的前几个吧,详细的我觉得应该看本专门的书
http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438288.html
// 系列,这个挺好的
http://www.cnblogs.com/haippy/p/3284540.html
// 还有上面那个系列的详细版,更棒
https://github.com/forhappy/Cplusplus-Concurrency-In-Practice
// 注意C++17有了新的mutex类型,
// 据说std::scoped_lock在个方面均严格优于lock_guard,
// 现在应该用新的mutex了
// 是在C++17的那个网页里看到的 http://blog.jobbole.com/111801/
// cppreference也有了http://en.cppreference.com/w/cpp/thread/scoped_lock