尾置返回类型
2023年12月15日 2023年12月15日
trailing return type
因为数组不能被拷贝,所以函数不能返回数组
函数的返回类型不能是数组, 但可以是指向数组的指针, 或者数组的引用
函数的返回类型不能时函数, 但可以是指向函数的指针
指向数组的指针
1int *p1[10]; // p1是数组, 元素类型为int * 2 3int (*p2)[10]; // p2是指针, 指向int [10]
函数的返回类型为指向数组的指针
-
常规方法
1Type (*function(parameter_list)) [dimension]; 2// Type是数组的基本类型 3// dimension是数组的维数 4// *表明是指向数组的指针 5 6int (*func(int i)) [10]; 7// func是函数名 8// int i是形参列表 9// *表明可以对函数调用的结果执行解引用操作 10// (*func(int i)) [10]表示解引用func的调用得到一个大小是10的数组 11// int (*func(int i)) [10]表示数组的元素是int
-
方法2: 使用类型别名
1typedef int arrT[10]; 2// <=> 3using arrT = int[10]; 4 5arrT* func(int i);
-
方法3: 使用尾置返回类型
1auto func(int i) -> int(*)[10];
-
方法4: 使用decltype
1int odd[] = {1, 3, 5, 7, 9}; // decltype(odd)得到 int[5] 2 3decltype(odd) *arrPtr(int i) // 返回一个指向数组的指针 4{ 5 return (i % 2) ? &odd : &even; 6}
指向函数的指针
1bool lengthCompare(const string &, const string &); 2bool (*pf)(const string &, const string &); // pf是一个函数指针, 函数签名为bool (const string &, const string &) 3 4pf = lengthCompare; // 函数被转换为函数指针 5pf = &lengthCompare; 6 7bool b1 = pf("hello", "goodbye"); // 函数指针被转换为函数 8bool b2 = (*pf)("hello", "goodbye");
形参类型为函数时, 会被转换成函数指针
1void useBigger(const string &s1, const string &s2, 2 bool pf(const string &, const string &)); // 把函数转换成函数指针 3 4void useBigger(const string &s1, const string &s2, 5 bool (*pf)(const string &, const string &));
函数类型和函数指针类型
1// 以下是函数类型 2typedef bool Func(const string &, const string &); 3typedef decltype(lengthCompare) Func2; 4 5// 以下是函数指针类型 6typedef bool (*FuncP)(const string &, const string &); 7typedef decltype(lengthCompare) *FuncP2; 8 9void useBigger(const string &s1, const string &s2, Func); // 编译器自动地将Func表示的函数类型转换成指针类型 10void useBigger(const string &s1, const string &s2, FuncP2);
函数的返回类型为指向函数的指针
不能返回一个函数,但是可以返回指向函数类型的指针
必须把返回类型写成指针形式: 编译器不会自动地将函数转换为对应的函数指针类型
-
常规方法
1int (*f1(int))(int *, int); 2// f1(int):函数名和形参列表 3// 返回类型是指针,指向int (int *, int)
-
方法2: 使用类型别名
1using F = int(int *, int); // F是函数类型 2using PF = int(*)(int *, int); // PF是函数指针类型 3 4PF f1(int); // 正确:返回类型为函数指针 5F *f1(int); // 正确:返回类型为函数指针 6 7F f1(int); // 错误
-
方法3: 使用尾置返回类型
1auto f1(int)->int (*)(int *, int);
尾置返回类型
在参数列表后面指定的返回类型
任何函数的定义都能使用尾置返回
这种形式对于返回类型比较复杂的函数最有效,如返回类型是数组的指针或数组的引用, 或者函数指针
尾置返回类型的位置在形参表之后,用->连接,原返回类型位置放置auto