網站首頁 編程語言 正文
一、什么是尾置返回類型(trailing return type)
我們先來看一下傳統的函數是怎么定義的:
int foo()
{
return 0;
}
C++11 標準中引入了尾置返回類型后,上述函數也可定義為:
auto foo() -> int
{
return 0;
}
其中 auto 是一個占位符,函數名后 -> 緊跟的 int 才是真正的返回類型。
當然了,在這個例子中傳統的函數聲明方式顯然是更加簡潔的,而當返回類型比較復雜的時候,返回類型后置可能會是一個不錯的選擇。任何函數的定義都能使用尾置返回。
二、尾置返回的典型場景
2.1 常規方式如何返回數組指針
首先來看一下如何返回數組指針。
因為數組不能被拷貝,所以函數不能返回數組。不過,函數可以返回數組的指針或應用。雖然從語法上來說,想要定義一個返回數組的指針或引用的函數比較繁瑣,但是有一些方法可以簡化這一任務,其中最直接的方法是使用類型別名。
typedef int arrT[10]; // arrT 是一個類型別名,它表示的類型是含有10個整數的數組
using arrT = int[10]; // arrT 的等價聲明
arrT* func(int i); // func 返回一個指向含有10個整數的數組的指針
其中 arrT 是含有10個整數的數組的別名。因為我們無法返回數組,所以將返回類型定義成數組的指針。因此,func 函數接收一個int實參,返回一個指向包含10個整數的數組的指針。
要想在聲明 func 時不使用類型別名,我們必須牢記被定義的名字后面數組的維度:
int arr[10]; // arr 是一個含有10個整數的數組
int *p1[10]; // p1 是一個含有10個指針的數組
int (*p2)[10]; // p2 是一個指針,它指向含有10個整數的數組
和這些聲明一樣,如果想定義一個返回數組指針的函數,則數組的維度必須跟在函數名字之后。然而,函數的形參列表也跟在函數名字后面且形參列表應該先于數組的維度。因此,返回數組指針的函數形式如下所示:
int arr[10]; // arr 是一個含有10個整數的數組
int *p1[10]; // p1 是一個含有10個指針的數組
int (*p2)[10]; // p2 是一個指針,它指向含有10個整數的數組
Type 表示元素類型,dimension 表示數組的大小。(*function(parameter_list))兩端的括號必須存在,如果沒有這對括號,函數的返回類型將是指針的數組。
示例如下:
Type (*function(parameter_list))[dimension]
可以按照如下的順序來逐層理解該聲明的含義:
- func(int i) 表示調用 func 函數時需要一個 int 類型的實參
- (*func(int i)) 意味著我們可以對函數調用的結果執行解引用操作
- (*func(int i))[10] 表示解引用 func 的調用將得到一個大小是10的數組
- int (*func(int i))[10] 表示數組中的元素是 int 類型
2.2 使用尾置返回類型
上述傳統的定義形式如果不能很好的理解的話,非常容易搞錯,我們再來看看使用尾置返回類型如何定義:
int (*func(int i))[10];
當我們把函數的返回類型放在了形參列表之后,就可以很清楚地看到func函數返回的是一個指針,并且該指針指向了含有10個整數的數組。
三、尾置返回類型的應用
C++11 標準中位置返回類型的作用之一就是推導函數模板的返回類型,當然了前提是需要用到decltype說明符,例如:
#include <iostream>
using namespace std;
template<class T1, class T2>
auto sum(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return t1 + t2;
}
int main()
{
auto s1 = sum(2, 3);
cout << "sum(2, 3)=" << s1 << endl;
cout << "s1 type: " << typeid(s1).name() << endl;
auto s2 = sum(2.0, 3.0);
cout << "sum(2.0, 3.0)=" << s2 << endl;
cout << "s2 type: " << typeid(s2).name() << endl;
return 0;
}
四、總結
C++11 標準引入的尾置返回類型,可以讓返回復雜類型的函數聲明更加清晰易讀。在無法使用C++14 標準的情況下,通過尾置返回類型的語法來推導函數模板的返回類型無疑是最簡便的方法。
注意,在引入C++14 標準后,C++14 標準支持對返回類型聲明為auto的推導。
參考文獻:
《C++ Primer第五版》
《現代C++語言核心特性解析》
原文鏈接:https://blog.csdn.net/hubing_hust/article/details/128622329
相關推薦
- 2022-11-09 python進行數據合并concat/merge_python
- 2021-11-25 C++實現截圖截屏的示例代碼_C 語言
- 2022-06-01 C語言線性表中順序表超詳細理解_C 語言
- 2023-10-15 #css# 超出高度,可上下滾動
- 2022-12-25 Flutter開發通用頁面Loading組件示例詳解_Android
- 2022-05-19 gorm整合進go-zero的實現方法_Golang
- 2022-08-07 gRPC超時攔截器實現示例_Golang
- 2022-04-05 報錯:Can‘t locate Debian/Debhelper/Dh_Lib.pm in @INC
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支