1.auto和模板參數類型推導擁有幾乎一模一樣的規則,所以Item1總結的規則對於auto適用。
2.auto和模板參數了類型推導有一個不相同的地方,不同在於對於花括號的處理不同。為什麼不同呢?王八屁股,規定!Scotter Meyer也不知道答案。
我們知道Item1 ,提出了三個不同的case:
1.類型描述符是指針或引用,並且不是全球通引用
2.類型描述符是全球通引用
3.類型描述符既不是指針,也不是引用
template<typename T> void f(ParamType param);
簡單來看,我們可以把auto當成模板函數參數描述符裡的 T。
const int x=5; auto y=x; //y is int. auto yy= 5; //yy is int. const auto cy = yy;
上面代碼類型推導遵循case3,所有的auto類型都是int。
const auto& ry= yy;
上面代碼遵循case1.
auto&& uref1 = x; // x is int and lvalue, // so uref1's type is int& auto&& uref2 = cx; // cx is const int and lvalue, // so uref2's type is const int& auto&& uref3 = 27; // 27 is int and rvalue, // so uref3's type is int&&
上面遵循case2.
auto會把花括號形式數據,轉換為初始化列表。
auto x3 = { 27 }; // type is std::initializer_list<int>, // value is { 27 }
而這樣如下方式使用模板就是錯誤
template<typename T> // template with parameter void f(T param); // declaration equivalent to // x's declaration f({ 11, 23, 9 }); // error! can't deduce type for T
並且對於C++14來說,無法編譯器無法推斷花括號返回類型,包括函數和lambda。
也無法推斷lamda的auto形參類型。