C++11中新特性:型別推導
阿新 • • 發佈:2021-01-07
C++11:型別推導
C++11標準為C++程式語言的第三個官方標準,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式標準釋出前,原名C++0x。它將取代C++標準第二版ISO/IEC 14882:2003 - Programming languages -- C++成為C++語言新標準。
C++11是對目前C++語言的擴充套件和修正, C++11不僅包含核心語言的新機能,而且擴充套件了C++的標準程式庫(STL) ,併入了大部分的C++ Technical Report 1(TR1) 程式庫(數學的特殊函式除外)。
C++11包括大量的新特性:包括lambda表示式,型別推導關鍵字auto、 decltype,和模板的大量改進。
auto
auto的自動型別推導,用於從初始化表示式中推斷出變數的資料型別。從這個意義上講,auto並非一種“型別”宣告,而是一個型別宣告時的“佔位符”,編譯器在編譯時期會將auto替換為變數實際的型別。
通過auto的自動型別推導,可以大大簡化我們的程式設計工作:
#include <iostream> #include <vector> #include <string> using namespace std; double foo() {} void func(vector<string> & tmp) { for (auto i = tmp.begin(); i < tmp.end(); i++) { // 一些程式碼 } } int main() { auto x = 1; // x的型別為int auto y = foo(); // y的型別為double struct m { int i; }str; auto str1 = str; // str1的型別是struct m auto z; // err, 無法推導,無法通過編譯 z = x; return 0; }
注意點:
void fun(auto x =1) {} // 1: auto函式引數,有些編譯器無法通過編譯
struct str
{
auto var = 10; // 2: auto非靜態成員變數,無法通過編譯
};
int main()
{
char x[3];
auto y = x;
auto z[3] = x; // 3: auto陣列,無法通過編譯
// 4: auto模板引數(例項化時),無法通過編譯
vector<auto> x = {1};
return 0;
}
decltype
decltype實際上有點像auto的反函式, auto可以讓你宣告一個變數,而decltype則可以從一個變數或表示式中得到其型別,如下:
#include <typeinfo>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int i;
decltype(i) j = 0;
cout << typeid(j).name() << endl; // 打印出"int", g++表示i
float a;
double b;
decltype(a + b) c;
cout << typeid(c).name() << endl; // 打印出"double", g++表示d
vector<int> vec;
typedef decltype(vec.begin()) vectype; // decltype(vec.begin()) 改名為 vectype
vectype k; // 這是auto無法做到的
//decltype(vec.begin()) k; // 這是auto無法做到的
for (k = vec.begin(); k < vec.end(); k++)
{
// 做一些事情
}
enum {Ok, Error, Warning}flag; // 匿名的列舉變數
decltype(flag) tmp = Ok;
return 0;
}
追蹤返回型別
返回型別後置:在函式名和引數列表後面指定返回型別。
int func(int, int);
auto func2(int, int) -> int;
template<typename T1, typename T2>
auto sum(const T1 & t1, const T2 & t2) -> decltype(t1 + t2)
{
return t1 + t2;
}
template <typename T1, typename T2>
auto mul(const T1 & t1, const T2 & t2) -> decltype(t1 * t2)
{
return t1 * t2;
}
int main()
{
auto a = 3;
auto b = 4L;
auto pi = 3.14;
auto c = mul( sum(a, b), pi );
cout << c << endl; // 21.98
return 0;
}