1、函数声明负责指定函数的名字、返回值(如果有的话)的类型以及调用该函数所需的参数数量和类型。
2、函数声明包含多种限定及修饰符,如下:
- 函数的名字,必选。
- 参数列表,可以为空(),必选。
- 返回类型,可以是void,可以是前置或者后置形式(使用auto),必选。
- inline,表示内联函数体实现函数调用。
- constexpr,表示当给定常量表达式作为实参时,应该可以在编译时对函数求值。
- noexcept,表示该函数不允许抛出异常。
- 链接说明,例如static。
- [[noreturn]],表示该函数不会用常规的调用/返回机制返回结果。
- virtual,表示该函数可以被派生类覆盖。
- override,表示该函数必须覆盖基类中的一个虚函数。
- final,表示该函数不能被派生类覆盖。
- static,表示该函数不与某一特定的对象关联。
- const,表示该函数不能修改其对象的内容。
3、在C和C++中,返回类型位于声明语句一开始的地方。然而,我们也可以在函数声明中把返回类型写在参数列表之后。
string to_string(int a); //前置返回类型
auto to_string(int a) -> string; //后置返回类型
4、inline限定符告诉编译器,应该尝试调用生成内联代码。
5、当constexpr出现在函数定义中时,它的含义是“如果给定了常量表达式作为实参,则该函数应该能用在常量表达式中”。而当constexpr出现在对象定义中时,它的含义是“在编译时对初始化器求值”。
6、函数必须足够简单,才能在编译时求值:constexpr函数必须包含一条独立的return语句,没有循环,也没有局部变量。同时,constexpr函数不能有副作用。