注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化
常量表达式不能用于virtual
常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错
当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE)
变长模板
C标准中的变长宏不强调类型并不安全
C++11中的tuple模板就是典型的变长模板...具体来说就是对一个内存上的变量的"读取-变更-储存"过程作为整体一次性完成
std::atomic来声明一个原子变量
一般来说原子类型都属于资源型的数据, 多个线程只能访问其拷贝, 删除了拷贝移动赋值等构造...有一个特殊的原子类型std::atomic_flag, 其特点是无锁赋值, 因此没有上面的三大函数, 而是使用test_and_set()和chear()这两个原子操作进行读写, 经常用于制作自旋锁....为了保证线程中的程序运行既能发挥优化的高效率又能拥有正确的顺序, C++11对底层硬件抽象出了一系列枚举值, 这些枚举值称为C++的内存模型
C++11中, 原子类型变量本身已经满足多线程的同步特性,