define而提出的编译期常量, 在表达式面前加上constexpr来声明
编译器会在编译时期对constexpr进行值计算, 类似模板元编程
constexpr可以在函数前声明, 但是C++11的时候常量表达式函数有很多限制...C++11的时候:
函数体只能有单一的return语句(或者额外的不影响数据的编译期语句)
函数必须返回值, 因为一定要从常量表达式中获得常量
函数使用前(编译期)一定要有定义
返回语句中不能有非常量的函数或数据...注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化
常量表达式不能用于virtual
常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错
当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE)
变长模板
C标准中的变长宏不强调类型并不安全
C++11中的tuple模板就是典型的变长模板...std::aligned_union()则针对union处理, 选择类型中对齐最严格的一个值返回
通用属性
C++ 中的属性 https://docs.microsoft.com/zh-cn/cpp/