C++有两个分水岭
一个是在C++11以前的
另一个是C++11以后的
称为Modern C++
这篇我就focus on Modern C++
大概就是C++11 C++14 C++17 C++20
Modern C++会强调
* Smart Pointer
自动回收空间
能避免dangling reference造成程式crash
* Perfect Forwarding / R-value reference
首先
先去了解什么是 r-value/l-value
再去了解r-value-reference/l-value-reference
然后完美转发就是基于 R-value reference
如果有人问你
"C++比C快在哪里"
你可以回它因为有着Perfect forwarding的机制在
* std:thread
concurrency的表准化
里面除了mutex外
还有效率更高的atom
两者有各自适合的地方
* constexpr关键字
可以让编译器在编译时期优化的一个新cv-qualified
* auto/decltype 型别推断
C++11开始引入
现在C++17已经算是很完整了
如果型别是编译时期就知道的
请使用auto关键字
给定一段程式
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{
//想自动取的It<T> 里面的型别T作为初始化宣告
T val = ...
}
你有想过我要如何自动得到并初始化
It<T>里面的型别T吗
这要要用到trait-class
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{ // b to e
while (b != e) {
typename std::iterator_traits<It>::value_type
currValue = *b;
…
}
}
三小 这么简地的事情也要弄到那么复杂的trait-class
C++11自从有了auto之后,
这件事情不再痛苦
template<typename It> // as before
void dwim(It b, It e)
{
while (b != e) {
auto currValue = *b;
…
}
* 请使用 using A = TYPE 取代 typedef
trait-calss是个有点复杂的东西
请爱用using + auto 取代这个
比方说
std::remove_const<T>::type 可以写成
std::remove_const_t<T> ,
而std::remove_const_t<T> 的实作即
template <class T>
using remove_const_t = typename remove_const<T>::type;
推荐书籍:
Effective Modern C++
但建议先看过:
Effective C++
结论: 欢迎跳槽到rust ^_^