日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型)

發布時間:2025/3/15 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在泛型編程中,可能需要通過參數的運算來得到返回值的類型。考慮下面這個場景:

template <typename R, typename T, typename U>R add(T t, U u){ return t+u;}int a = 1; float b = 2.0;auto c = add<decltype(a + b)>(a, b);

我們并不關心 a+b 的類型是什么,因此,只需要通過 decltype(a+b) 直接得到返回值類型即可。但是像上面這樣使用十分不方便,因為外部其實并不知道參數之間應該如何運算,只有 add 函數才知道返回值應當如何推導。

那么,在 add 函數的定義上能不能直接通過 decltype 拿到返回值呢?

template <typename T, typename U>decltype(t + u) add(T t, U u) // error: t、u尚未定義{ return t + u;}

當然,直接像上面這樣寫是編譯不過的。因為 t、u 在參數列表中,而?C++?的返回值是前置語法,在返回值定義的時候參數變量還不存在。

可行的寫法如下:

template <typename T, typename U>decltype(T() + U()) add(T t, U u){ return t + u;}

考慮到 T、U 可能是沒有無參構造函數的類,正確的寫法應該是這樣:

template <typename T, typename U>decltype((*(T*)0) + (*(U*)0)) add(T t, U u){ return t + u;}

雖然成功地使用 decltype 完成了返回值的推導,但寫法過于晦澀,會大大增加 decltype 在返回值類型推導上的使用難度并降低代碼的可讀性。

因此,在 C++11 中增加了返回類型后置(trailing-return-type,又稱跟蹤返回類型)語法,將 decltype 和 auto 結合起來完成返回值類型的推導。返回類型后置語法是通過 auto 和 decltype 結合起來使用的。上面的 add 函數,使用新的語法可以寫成:

template <typename T, typename U>auto add(T t, U u) -> decltype(t + u){ return t + u;}

為了進一步說明這個語法,再看另一個例子:

int& foo(int& i);float foo(float& f);template auto func(T& val) -> decltype(foo(val)){ return foo(val);}

如果說前一個例子中的 add 使用 C++98/03 的返回值寫法還勉強可以完成,那么這個例子對于 C++ 而言就是不可能完成的任務了。

在這個例子中,使用 decltype 結合返回值后置語法很容易推導出了 foo(val) 可能出現的返回值類型,并將其用到了 func 上。返回值類型后置語法,是為了解決函數返回值類型依賴于參數而導致難以確定返回值類型的問題。有了這種語法以后,對返回值類型的推導就可以用清晰的方式(直接通過參數做運算)描述出來,而不需要像 C++98/03 那樣使用晦澀難懂的寫法。

總結

以上是生活随笔為你收集整理的返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。