在函式返回值/range-for 等情況中
1、auto使用有5種用法
auto :拷貝
auto& :左值引用,只能接左值(和常量右值)
auto&& :萬能引用,能接左值和右值
const auto& :const 萬能引用,能接左值和右值
const auto&& :常量右值引用,只能接右值
很多人直接就寫成 auto&&,但盡量分場景使用
auto:用於你想修改右值的情形
auto&:用於你想修改左值的情形
auto&&:用於泛型程式設計中的**
const auto&:用於唯讀
const auto&&:基本沒用,基本可被 const auto& 替代(比 const auto& 多乙個語義:一定得是右值。然而這沒什麼用,因為你都不對其進行修改,是左還是右沒什麼影響)
2、返回值自動推導,增強模板的泛型能力
//c++11
template
auto sum(t1&& x, t2&& y) -> decltype(x + y)
// c++14:
template
auto sum(t1&& x, t2&& y)
3、泛型lambda
// c++14;
auto mul = (const auto x, const auto y) ;
4、decltype(auto)推導保留cv:
// c++14;
template
decltype(auto) accessvector(t&& c, i i) // 返回 int&;
int main(int argc, char** ar**) ;
accessvector(v, 0) = 10000;
std::cout << v.at(0) << std::endl; // 10000;
return 0;
}5、做perfect forwarding中對{}表示式的中轉
void foo(std::vectorv)
}template
void forwardfunc(arg&& ...args)
int main(int argc, char** ar**) ;
forwardfunc(il);
return 0;
}6、簡化函式指標寫法
int(*(*foo)())() {};
auto
foo() -> auto (*)() ->
int(*)() {};
// 與上述等價;
需要注意的幾個坑
1、stl **型別導致 auto 可能推導出並非自己想要的型別:
// 主要源於 std::vector 在儲存布林元素時的特殊方式;
int main(int argc, char** ar**) ;
auto x = v.at(0); // std::vector::reference, not bool;
return 0;
}2、auto 在推導 list initialization 表示式時的預設型別(std::initializer_list)
int main(int argc, char** ar**) ; // std::initializer_list;}
c 中的auto關鍵字
auto等同於c 的var。從其初始表示式推斷宣告的變數的型別。用於編譯器已宣告變數的初始化表示式,或使用lambda表示式引數來推導。除非確實需要使用轉換,否則都需要用auto。它擁有可靠性 效能 不進行任何轉換 可用性 拼寫錯誤 效率 量 需要注意的是auto只代表型別或類,無法代表指標 引用等...
auto關鍵字 decltype關鍵字
自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...
C 之auto關鍵字
在那些情況下要申明型別 定義變數型別 函式返回值,函式引數 表示式返回變數型別 為什麼auto 在開發實踐中,有時候我們並不能非常容易地確定乙個變數應該具有的資料型別。比如,將某個複雜表示式作為初始值賦值給乙個新定義的變數時,我們往往很難確定這個表示式的資料型別,從而無法確定變數應有的資料型別。為了...