C++11的时候:
函数体只能有单一的return语句(或者额外的不影响数据的编译期语句)
函数必须返回值, 因为一定要从常量表达式中获得常量
函数使用前(编译期)一定要有定义
返回语句中不能有非常量的函数或数据...注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化
常量表达式不能用于virtual
常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错
当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE)
变长模板
C标准中的变长宏不强调类型并不安全
C++11中的tuple模板就是典型的变长模板...注意函数参数包必须是函数的最后一个参数包(模板参数包没有这个要求)
模板参数包可以在以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求:
表达式
初始化列表
基类描述列表
类成员初始化列表...位域不能是类的静态成员
位域在内存中是从低向高顺序放置的
位域的典型应用是bool的极限压缩(bool:1)和RGB565分配(R:5, G:6, B:5)
语法和内存布局如下:
// 通过成员名后加冒号和位域结束的