, 在表达式面前加上constexpr来声明
编译器会在编译时期对constexpr进行值计算, 类似模板元编程
constexpr可以在函数前声明, 但是C++11的时候常量表达式函数有很多限制, 后来的版本渐渐放松限制...注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化
常量表达式不能用于virtual
常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错
当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE)
变长模板
C标准中的变长宏不强调类型并不安全
C++11中的tuple模板就是典型的变长模板...注意函数参数包必须是函数的最后一个参数包(模板参数包没有这个要求)
模板参数包可以在以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求:
表达式
初始化列表
基类描述列表
类成员初始化列表...很直观的, 类型不完整的类无法通过alignof的编译
// 这里的Color按照8字节对齐, 但是结构体显然大多数时侯是一整个一整个地访问的
// 那么8字节的对齐并不能提高读写的效率, 也不能充分利用缓存