c++11特性
01 Jan 2015
|
c++11相比于c++03增加了约140个新特性。以及对c++03标准中约600个缺陷的修正。
2013年 GCC 4.8.1,这是该编译器由C实现转向C++实现(4.8版本)后的首次升级,也是第一个实现C++11所有语言特性的编译器。
cppreference.com
The Boost C++ Libraries
c++11 vs boost
原Boost库 | C++11新的特性或库 |
---|---|
Move | 右值引用 |
Thread | thread |
SmartPtr | 新的标准库std::unique_ptr、std::shared_ptr、std::weak_ptr |
Bind | 新的标准库std::bind |
Function | 新的标准库std::function |
Array | 新的标准库std::array |
BOOST_Lambda | Lambda表达式 |
Regex | C++11的regex |
Random | random |
Tuple | 新的标准库std::tuple |
BOOST_FOREACH | 基于Range的for循环替代。(序列for循环,有点像Python的for循环了) |
Functional/Forward | 新的标准库std::forward |
Min-Max | 新的标准库std::min、max、std::minmax_element |
Ratio | 新的标准库std::ratio |
StaticAssert | static_assert |
Typeof | auto, decltype,推断变量或表达式的数据类型 |
Valueinitialized | List-initialization |
EnableIf | 新的标准库std::enable_if |
MemberFunction | 新的标准库std::mem_fn |
Ref | 新的标准库std::ref、std::cref |
ResultOf | 新的标准库std::result_of |
Swap(swapping arrays) | 新的标准库std::swap |
TypeTraits | type_traits |
Unordered | unordered_set、unordered_map |
C++11带来的优雅语法 http://blog.jobbole.com/99070/
c++11 core features:
右值引用 && 语义转移 std::move
- 右值引用的意义通常解释为两大作用:移动语义和完美转发。
- C++中右值可以被赋值给左值或者绑定到引用。类的右值是一个临时对象,如果没有被绑定到引用,在表达式结束时就会被废弃。于是我们可以在右值被废弃之前,移走它的资源进行废物利用,从而避免无意义的复制。被移走资源的右值在废弃时已经成为空壳,析构的开销也会降低。
- 右值中的数据可以被安全移走这一特性使得右值被用来表达移动语义。
- 没有右值引用的时候,为避免临时对象的多余复制,和实现函数的完美转发,使了很多古怪手段,当有了右值引用,解决相同的问题,已经简单很多了。
- 一句话答案:右值引用的出现是为了实现移动语义,顺便解决完美转发的问题,其意义在于扩充了值语义,帮助Modern C++可以全面地应用RAII。原因即在于C++独有的值语义:程序员通过值语义可以方便直观地控制对象生命期,让RAII用起来更自然。
典型右值用来表达移动语义:如String类
- 移动构造函数
- 移动拷贝函数
- 移动赋值运算符
- std::move() 强制转换左值成右值引用
典型右值用来实现函数的完美转发:
智能指针
shared_ptr
weak_ptr 弱引用 解决相互引用问题
auto 自动类型推到
function
bind
lambda 允许捕获局部变量的局部函数,避免传递参数
捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。
Lambda表达式完整的声明格式如下:
[capture list] (params list) mutable exception-> return type { function body } 各项具体含义如下
- capture list:捕获外部变量列表
- params list:形参列表
- mutable指示符:用来说用是否可以修改捕获的变量
- exception:异常设定
- return type:返回类型
-
function body:函数体
- []不捕获任何变量。
- [&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
- [=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
- [=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
- [bar]按值捕获bar变量,同时不捕获其他变量。
- [this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。
lambda + function + bind + auto
RAII 资源获取即初始化
std::thread 使用很灵活 坑也容易多
nullptr
空指针标识(nullptr)(其本质是一个内置的常量)是一个表示空指针的标识,它不是一个整数。这里应该与我们常用的NULL宏相区别,虽然它们都是用来表示空置针,但NULL只是一个定义为常整数0的宏,而nullptr是C++11的一个关键字,一个内建的标识符。
std::thread + std::vector
- 命名空间 namespace moreplus{}
- RAII 资源即初始化
- 多线程 线程安全
- assert 断言 失效终止
- 结构体构造函数初始化 no memset
- 枚举类型数据
- STL(vector,map…) BOOST(function/bind、shared_ptr、noncopyable)