程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 《Effective Modern C++》Item 2總結,effectivemodernc

《Effective Modern C++》Item 2總結,effectivemodernc

編輯:C++入門知識

《Effective Modern C++》Item 2總結,effectivemodernc


先提出兩個基本觀點:

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形參類型。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved