函式返回型別自動推導是指c++11以及c++14中不直接給出函式返回型別,而是使用型別指示符來指示返回型別甚至徹底省略返回型別並最終由編譯器來推導返回型別的語言特性。
函式返回型別自動推導原則如下:
當lambda表示式中省略返回型別時,lambda表示式的返回型別由編譯器根據返回值以及模板引數推導規則進行自動推導。
當函式的返回型別包含auto指示符並且函式的後置返回型別被省略時,函式的返回型別由編譯器根據返回值以及模板引數推導規則進行自動推導。
當函式的返回型別為decltype(auto)指示符時,函式的返回型別由編譯器根據返回值以及decltype推導規則進行自動推導。
#include #include #include templatet f();
auto f2(int n)
auto f3(bool b)
auto f4(int n)
struct s
};int main()
; auto f5 = (auto a, auto b);
f();
f();
f();
f();
f();
s s;
f();
}
main.cpp:(.text.startup+0x5): undefined reference to `void f()'
main.cpp:(.text.startup+0xa): undefined reference to `int f()'
main.cpp:(.text.startup+0xf): undefined reference to `double f()'
main.cpp:(.text.startup+0x14): undefined reference to `int f()'
main.cpp:(.text.startup+0x19): undefined reference to `float f()'
main.cpp:(.text.startup+0x1e): undefined reference to `int& f()'
這段**使用了一種特殊技巧來檢視編譯器所實際推導出的函式返回型別。**中定義了乙個未被實現的函式模板f,該函式模板有乙個型別引數t。如果用某個型別t來呼叫該函式模板,編譯器就會因找不到函式模板的定義而輸出」t f()未被定義「的出錯資訊。也就是說,利用該函式模板,我們便可以在編譯器所輸出的出錯資訊中檢查模板引數t的實際型別。在main函式內,我們充分利用了這乙個技巧,通過利用函式返回型別呼叫該函式模板來讓編譯器輸出相應的型別。
從出錯資訊中可以得知:
C 14學習筆記 2 函式返回型別推導
雖然普通函式不能使用auto形參,但可以使用返回型別推導。在c 11中我們可以使用後置返回型別推導來完成這件事情 2.1 c 11中使用後置返回型別推導 auto add int x,int y decltype x y 而在c 14中,我們可以省略decltype,編譯器直接由return語句的值...
C 14嘗鮮 在C 中實現LINQ
如今在c 中linq已經有了眾多實現,其中實現度最高,更新最及時,文件最完整的當推linq for c cpplinq 以下的示例 使用c 14再現了cpplinq的主要實現技巧。include include templatestruct from range range介面的成員方法 過載 操作...
c 型別識別和型別自動推導
c 是一門靜態編譯語言,不支援動態型別的獲取,但在實際情況中,經常會遇到資料型別的判斷。什麼是型別識別?其實就是rtti,執行時型別識別,也就是得到資料的實際定義型別。那麼在c 中簡單的獲取型別有幾種方法 在 c 程式設計思想 第8章 執行時型別識別 中提到了三種基本方法 1 手動控制 多型機制 即...