在 C++ 11 新标准中还有一种可以简化 《C++ 返回数组指针》 中提到的 getArrayType 声明的方法,这就是使用 使用尾置返回类型。任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效,比如返回类型是数组的指针或者数组的引用。尾置返回类型跟在形参列表后面并以一个 “->” 符号开头。为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的位置放一个 auto:
auto getArrayType(int i) -> int(*)[10];
因为我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到 getArrayType 函数返回的是一个指针,并且该指针指向了含有 10 个整数的数组。
我们还可以使用 decltype 类型指示符
还有一种情况,如果我们知道函数返回的指针将指向哪个数组,就可以使用 decltype 类型指示符。例如,下面的函数返回一个指针,该指针根据参数 i 的不同指向两个已知数组中的一个:
int odd[] = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};
// 返回一个指针,该指针指向含有 5 个整数的数组
decltype(odd) *arrptr(int i) {
return (i % 2) ? &odd : &even;
}
arrptr 使用关键字 decltype 表示它返回类型是一个指针,并且该指针所指的类型与 odd 类型一致。因为 odd 是一个数组,所以 arrptr 返回一个指向含有 5 个整数的数组的指针。有一个地方需要注意:decltype 并不负责把数组类型转换成对应的指针,所以 decltype 的结果是一个数组,要想表示 arrptr 返回指针还必须像示例中一样在函数声明时加一个 * 符号。
网友评论