新的改变
nullptr
- 在C++11中,nullptr是一个所谓“指针空值类型”的常量。
- nullptr类型数据所占用的内存空间大小和void*是相同的。
- nullptr和
(void*)0
- 前者是一个编译时期常量
- 后者只是一个强制转换表达式,返回的也是一个void*指针类型。
nullptr_t
- 指针空值类型被命令为
nullptr_t
。 - C++11严格规定了数据间的关系:
- 所有定义为nullptr_t类型的数据都是等价的,行为也完全一致。
- nullptr_t类型数据可以隐式转换成任意一个指针类型。
- nullptr_t类型数据不能转换为非指针类型,即使使用
reinterpret_cast<nullptr_t>()
的方式也不可以。 - nullptr_t类型数据不适用于算术运算表达式。
- nullptr_t类型数据可以用于关系运算表达式,但仅能与nullptr_t类型数据或者指针类型数据进行比较,当前仅当关系运算符为
==,<=,>=
等时返回true。
=default
- 显式缺省函数
=delete
- 删除函数
lambda
- 在数理逻辑或计算机科学领域中,lambda被用来表达一种匿名函数。
这种匿名函数代表了一种所谓λ演算。
1 2 3 4 |
[]() mutable -> return_type { /*do someting*/ } // 最简洁的lambda表达式 []{}; |
- 默认情况下,lambda总是一个const函数,但是加了mutable,就可以对类成员变量进行操作了。
- 可调用对象
- 函数
- 函数指针
- lambda表达式
- bind创建的对象
- 重载了函数调用操作符的类
- lambda函数在C++11标准中是默认内联的。
- 值捕获和引用捕获
- 对于值捕获的方式来讲,传递的值在lambda定义的时候就是确定的了,值传递意味着位逐次拷贝
- 对于引用捕获的方式而言,捕获的值是在lambda调用的时候确定的。
- 捕获规则:
- [] 空捕获列表,lambda不能使用所在函数中的变量
- [names] names是一个逗号分隔的名字列表,都是lambda所在函数的局部变量
- [&] 隐式引用捕获方式,lambda中所使用的和来自所占函数的实体都采用引用的方式使用
- [=] 隐式值捕获方式,lambda体将拷贝所使用的来自所在函数的实体的值
- [&, identifier_list] identifier_list显式列出来的变量采用值捕获的方式,其他隐式捕获的变量都采用引用捕获的方式
identifier_list的名字前面不能使用& - [=, identifier_list] identifier_list显示列出来的采用引用捕获的方式,其他隐式捕获的变量都采用值捕获的方式
identifier_list中的名字不能包括this,且这些名字必须使用&
- 从C++11标准的定义,lambda被定义为“闭包“的类,每个lambda表达式会产生一个闭包类型的临时对象(右值)。
- 对于函数指针,如果lambda表达式没有捕获任何变量,且函数函数指针的函数原型和lambda有着相同的调用方式,C++11标准允许lambda向函数指针的转换。
实际应用
数据对齐
- 对齐的数据在读写上会有性能上的优势。
- 可以使用alignof来查看数据的对齐方式。
- alignas是对齐描述符,它既可以接受常量表达式,也可以接受类型作为参数。
- 在使用常量表达式作为alignas的操作符的时候,其结果必须是2的自然数幂次作为对齐值。
- 对齐值越大,称其对齐要求越高;对齐值越小,称其对齐要求越低。
- C++11标准规定了一个”基本对齐值“:
- 一般情况下其值通常等于平台上支持的最大标准类型数据的对齐值(通常是long double)。
- 可以通过alignof(std::max_align_t)来查询其值。
- 对齐描述符可以作用于各种数据。
- 具体来说,可以修饰变量、类的数据成员等。
- 而位域以及用register声明的变量则不可以。
- C++11对于对齐的支持并不限于alignof操作符和alignas描述符。还有其他的:
- STL库里面还有std::align函数来动态地根据指定的对齐方式调整数据块的位置。
- aligned_storage
- aligned_union
通用属性
__attribute__
- 可为程序中的函数、变量和类型设定一些额外信息。
__declspec
- 用于指定存储类型的扩展属性关键字。
C++11通用属性
- [[attribute-list]]
unicode
C++11unicode
- char16_t
- 用于存储UTF-16编码的unicode数据
- char32_t
- 用于存储UTF-32编码的Unicode数据
- 前缀
- u8:表示UTF-8
- u:表示UTF-16
- U:表示UTF-32
1 2 3 4 |
size_t mbrtoc16(char16_t* pc16, const char* s, size_t n, mbstate_t* ps); size_t c16rtomb(char* s, char16_t c16, mbstate_t* ps); size_t mbrtoc32(char32_t* pc32, const char* s, size_t n, mbstate_t* ps); size_t c32rtomb(char* s, char32_t c32, mbstate_t* ps); |
codecvt
- codecvt是一个模板类,从功能上,是一种能够完成当前locale下多字符编码字符串到多种Unicode字符编码转换的facet。
1 2 3 4 5 6 7 8 9 10 11 |
// 完成多字节与char之间的转换 std::codecvt<char, std::mbstate_t> // 完成UTF-16与UTF-8之间的转换 std::codecvt<char16_t, char, std::mbstate_t> // 完成UTF-32与UTF-8之间的转换 std::codecvt<char32_t, char, std::mbstate_t> // 完成多字节与wchat_t之间的转换 std::codecvt<wchar_t, char, std::mbstate_t> |
原生字符串字面量
1 |
std::cout << R"(hello, \n world)" << std::endl; |
弃用特性
- auto关键字
- 标识具有自动存储期的局部变量
- export
- 关键字被保留,但不包含任何语义
- register
- 原来是将变量存放在寄存器中
- 现在是声明存储类的关键字
- auto_ptr
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Boost 程序库完全开发指南:工具与字符串08/22
- ♥ SOUI源码:log4z06/24
- ♥ Soui五05/30
- ♥ Objective-C 解析plist04/28
- ♥ C++11_第一篇12/01
- ♥ Dump分析:调试方法与实践,空指针访问03/15