
C++11
文章平均质量分 87
介绍C++11新特性。
恋喵大鲤鱼
一条不止于编码的鱼。
展开
-
C++11 原子类型与原子操作
atomic_flag 只支持 test_and_set() 以及 clear() 两个成员函数,test_and_set()函数检查 std::atomic_flag 标志,如果 std::atomic_flag 之前没有被设置过,则设置 std::atomic_flag 的标志;有一个比较特殊的原子类型是 atomic_flag,因为 atomic_flag 与其他原子类型不同,它是无锁(lock_free)的,即线程对其访问不需要加锁,而其他的原子类型不一定是无锁的。原子类型C++11中通过。原创 2019-01-02 00:21:41 · 16881 阅读 · 5 评论 -
C++11 强类型枚举
1.传统枚举类型的缺陷枚举类型是C/C++中用户自定义的构造类型,它是由用户定义的若干枚举常量的集合。枚举值对应整型数值,默认从0开始。比如定义一个描述性别的枚举类型。enum Gender{Male,Female};其中枚举值Male被编译器默认赋值为0,Female赋值为1。传统枚举类型在设计上会存在以下几个问题。(1)同作用域同名枚举值会报重定义错误。传统C++中枚举常量被暴漏在同...原创 2018-12-28 23:38:31 · 2506 阅读 · 0 评论 -
C++11 用户自定义字面量
C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型。实际上,自定义字面量一般用于用户自定义的构造类型(结构体与类)。假如入我们有如下一个表示颜色的类。如何书写类RGBA的字面量值呢,我们需要实现自定义后缀操作符。最后四个对于字符串相当有用,因为第二个参数会自动推断为字符串的长度。完成自定义后缀操作符函数后,我们可以使用自定义字面量来表示一个RGBA的对象了。总体来说,用户自定义字面量为代码书写带来了极大的便利。原创 2018-12-28 15:00:42 · 4543 阅读 · 2 评论 -
C++11 显示类型转换
1.隐式类型转换的问题隐式类型转换是C++一个让人又爱又恨的特性,使用方便,但可能会降低代码可读性,甚至会造成一些十分隐晦的错误。#include<iostream>usingnamespacestd;classMyInt{public: //单参构造函数 explicitMyInt(intvalue):_value(value) {} //类型转...原创 2018-12-16 23:05:22 · 1513 阅读 · 0 评论 -
C++11 函数模板的默认模板参数
1.函数模板默认模板参数简介函数模板与类模板在C++98一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以。从C++11开始,这个限制被解除了,即函数模板同样可以拥有默认模板参数。默认模板参数的用法与函数的默认参数类似,考察如下示例:#include <iostream>using namespace std;//函数默认参数void testFunc(i...原创 2018-12-15 23:53:03 · 8525 阅读 · 0 评论 -
C++17 fold expression
C++11 增加了一个新特性变参模板(variadic template),它可以接受任意个模版参数,参数包不能直接展开,需要通过一些特殊的方法,比如函数参数包的展开可以使用递归方式或逗号表达式,在使用的时候有点难度。C++17 解决了这个问题,通过折叠表达式(fold expression)简化对参数包的展开。原创 2018-08-28 16:23:11 · 4120 阅读 · 2 评论 -
C++11 变参模板
1.概述2.可变模版参数的展开2.1变参函数模版2.1.1递归函数方式展开参数包2.1.2逗号表达式展开参数包2.2变参类模版2.2.1偏特化与递归方式展开2.2.2继承方式展开3.变参模板的应用3.1消除重复代码3.2实现泛化的delegate4.总结参考文献1.概述变参模板(variadic template)是C++11新增的最强大的...原创 2018-08-28 14:51:55 · 2708 阅读 · 0 评论 -
C++0x 通用属性
1.编译器扩展属性2.C++11通用属性2.1语法格式2.2[[ noreturn ]]2.3[[carries_dependency]]3.C++14与C++17通用属性参考文献1.编译器扩展属性C++在不断的发展,但每一阶段的C++标准提供的功能都很难完全满足现实需求,于是为了弥补标准的不足或者扩增特性应用场景所需的特性,各大C++编译器厂商多多少少在标准之...原创 2018-08-27 23:57:18 · 1525 阅读 · 0 评论 -
C++11 原生字符串
由于C++11对Unicode的支持,原生字符串的定义方式可以与Unicode字符串结合使用,定义UTF-8、UTF-16和UTF-32的原生字符串,将其前缀分别设置为u8R、uR和UR即可。可以看出,原生字符串会被编译器自动连接在一起,整个字符串“你好=hello”含有两个UTF-8编码的中文字符,共占6字节,和6个ASCII字符,再加上自动生成的空字符\0,字符串共占用13字节空间。在使用sizeof运算符计算不同编码的相同字符串时,得到的结果是不通的,大小跟其申明的类型是完全一致的。原创 2018-08-24 20:12:15 · 13926 阅读 · 3 评论 -
C++11 Unicode 支持
1.char16_t与char32_t在C++98中,为了支持Unicode字符,使用wchar_t类型来表示“宽字符”,但并没有严格规定位宽,而是让wchar_t的宽度由编译器实现,因此不同的编译器有着不同的实现方式,GNU C++规定wchar_t为32位,Visual C++规定为16位。由于wchar_t宽度没有一个统规定,导致使用wchar_t的代码在不同平台间移植时,可能出现问题。...原创 2018-08-24 13:20:26 · 7391 阅读 · 5 评论 -
C++11 继承构造函数
1.简介子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递。如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数。class Base{public: Base(int va) :m_value(va), m_c(‘0’){} Base(char c) :m_c(c) , m_value(0){...原创 2018-08-15 14:43:53 · 28757 阅读 · 11 评论 -
C++11 委托构造函数
1.简介委托构造函数(Delegating Constructor)由C++11引入,是对C++构造函数的改进,允许构造函数通过初始化列表调用同一个类的其他构造函数,目的是简化构造函数的书写,提高代码的可维护性,避免代码冗余膨胀。通俗来讲,一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。和其他构造函数一样,一个委托...原创 2018-08-15 14:41:39 · 4809 阅读 · 0 评论 -
C++11 POD 类型
POD(Plain Old Data,普通旧数据)类型是从C++11开始引入的概念,Plain代表它是一个普通类型,Old代表它可以与C兼容。通俗的讲,一个类、结构、共用体对象或非构造类型对象能通过二进制拷贝(如memcpy())后还能保持其数据不变正常使用的就是POD类型的对象。严格来讲,一个对象既是普通类型(Trivial Type)又是标准布局类型(Standard-layout Type)...原创 2018-08-09 11:50:33 · 3372 阅读 · 1 评论 -
C++11 移动语义与右值引用
1.对象移动C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。参考如下程序://moveobj.cpp#include <iostream>#include <vector>原创 2016-09-08 23:36:43 · 2710 阅读 · 0 评论 -
C++11 Lambda 表达式
1.简介定义: C++11新增了很多特性,lambda表达式(lambda expression)就是其中之一,很多语言都提供了 lambda 表达式,如 Python,Java ,C#等。本质上, lambda 表达式就是一个可调用的代码单元[1]^{[1]}。作用: 以往C++需要传入一个函数的时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数...原创 2016-11-23 01:00:47 · 3541 阅读 · 0 评论 -
C++11 新关键字
1.autoauto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用。在C++11中被赋予了新的含义和作用,用于类型推断。auto关键字主要有两种用途:一是在变量定义时根据初始化表达式自动推断该变量的类型,二是在声明或定义函数时作为函数返回值的占位符,此时需要与关键字decltype连用。1.1用法示例(1)auto用于推断变量类型示例。auto i = 42;......原创 2016-12-26 21:49:43 · 4024 阅读 · 4 评论 -
C++11 就地初始化与列表初始化
C++11之前,C++主要有以下几种初始化方式://小括号初始化string str("hello");//等号初始化string str="hello";//大括号初始化struct Studnet{ char* name; int age;};Studnet s={"dablelv&原创 2017-02-15 14:12:56 · 16171 阅读 · 0 评论 -
C++11 range-based for loop
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中。range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作。1.基本语法for(declaration:expression) statement其中,declaration定义一个变量,该变量将被用于访问序列中的基础元素,每次迭代,declaration部分的...原创 2017-02-26 15:58:25 · 3875 阅读 · 0 评论