六一的部落格


关关难过关关过,前路漫漫亦灿灿。



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


尾置返回类型


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