2017-08-16,17c++笔记

1 constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。

constexpr int Inc(int i) {
    return i + 1;
}
 
constexpr int a = Inc(1); // ok
constexpr int b = Inc(cin.get()); // !error
constexpr int c = a * 2 + 1; // ok

2 模板参数包是接受零或更多模板实参(非类型、类型或模板)的模板形参。函数模板形参报是接受零或更多函数实参的函数形参。
至少有一个参数包的模板被称作变参数模板。

变参数类模板可用任意数量的模板参数实例化:

template<class ... Types> struct Tuple {};
Tuple<> t0; // Types 不包含实参
Tuple<int> t1; // Types 包含一个实参: int
Tuple<int, float> t2; // Types 包含二个实参: int 与 float
Tuple<0> error; // 错误: 0 不是类型

变参数函数模板可用任意数量的函数实参调用(模板参数通过模板实参推导推导):

template<class ... Types> 
void f(Types ... args);
f(); // OK : args 不包含实参
f(1); // OK : args 包含一个实参: int
f(2, 1.0); // OK : args 包含二个实参: int 与 double

如果在头文件里面定义函数,它被几个cpp文件include的时候,会触发链接错误,如果函数较小,加上inline 即可,或者用static关键字

推荐阅读更多精彩内容