分类: C/C++
2013-01-26 12:23:11
Chapter 6 Functions
1. 变长参数列表利器:initializer_list。
c中也有一个varlist记得,c++11中新增加的initializer_list只能处理变长参数列表中所有参数都是同一类型的场景,就像一个参数容器。
不同类型参数列表SBL说在16章有介绍。
void f(initializer_listvs){ for(auto s: vs) cout< 调用的时候结合新增的大括号赋值
f({"hello","world"});
注意:(1-函数参数中有initializer_list时,要么只有这一个参数,像上面的f;要么其位于所有参数的最后
f(initializer_list
vs, int flag);//这样编译无法通过的 (2-initializer_list带入的参数都是只读的,不可更改。
(3-initializer_list有begin,end,size这三个成员函数。
2.函数可以返回list-initializing,就是大括号那种
vector
f2(){
return {"hello","world"};
}不一定非要用vector,可以是定义了接受list-initializing为参数的类型。
3. 简化函数的返回值。但返回值比较复杂时很有用。
(1)使用 trailing return type,格式为函数参数后面加 “-> type”
auto f(int)->int;//接受int参数,返回int的函数
auto f()-> int(*)[10];//返回指向10个int元素数组的指针
(2)用decltype
int a[10];
decltype(a) * f();//返回指向10个int元素数组的指针,因为decltype不会进行数组向指针的转换,所以需要加*。
4. constexpr 修饰的常函数。
constexpr加在函数最前,表示这个函数返回值是个常量。
constexpr f(){return 3;}
constexpr f(int i){return 3*i;}
以上都可以,特殊限制是函数体内严格只能有一个return语句,否则编译不过
body of constexpr function 'constexpr int f3(int)' not a return-statement
constexpr函数是隐含内联的,所以应该和其它内联函数一起放在头文件。